原型链(__proto__)
前面详细的解释了new的几个步骤,其中随意带过了一下原型链的概念,如果细读那篇文章,基本对原型也能有所理解。
原型有两个关键属性,一个是 __proto__ 一个是 prototype ,了解了这两个对象基本就能了解整个原型链的关系。
本篇主要探讨一下 __proto__ 这个属性。
javascript中几乎所有类型都拥有 __proto__ 这个属性,可以打印下面的 __proto__ 的值看看都是什么结果。
"字符串".__proto__
(123456).__proto__
(true).__proto__
(function(){}).__proto__
([]).__proto__
({}).__proto__
它们都有值,并且它们的值似乎告诉它们是什么,例如前面都有类型如 String 或 Boolean 或在直接放回该类型的字面量写法 function(){}; []; {}; ,那现在就假设 __proto__ 的用处就是说出它们是谁.。
再关注一点细节,这三个基本类型的 __proto__ 有一些相似,大概是这样的。
String {length: 0, [[PrimitiveValue]]: ""}
Number {[[PrimitiveValue]]: 0}
Boolean {[[PrimitiveValue]]: false} //以上出自chrome控制台
这三个值都是对象,展开它们会发现一些这种类型常用的属性,例如
length
match
toFixed
toString
它们都是什么鬼,难道在使用这些属性或方法的时候都是通过__proto__上找的,我只好假定 __proto__ 的作用是提供一些js原生的属性和方法,那么刚好就得出一个结论这些值原生的属性和方法都是从 __proto__ 来的。
接着往下走吧,还是不能理解 __proto__ ,但是大概了解了它的一些信息。
还发现一个规律, __proto__ 里面还有一个 __proto__ ,并且它们的值都是一样的并且是一个Object对象,这里又可以得出一个结论,这些数据类型通过 __proto__ 都会找到同一个Object对象。
再接下来插播一下null和undefined
为什么整篇都不见 undefined 和 null 这两个基友,而且当使用 undefined.__proto__ 和 null.__proto.__ 的时候会报错,说明这两个并没有这两个属性,但是在js中没有这个属性会返回 undefined ,那只能根据错误提示来参考,
Uncaught TypeError: Cannot read property '__proto__' of undefined
未知的类型错误,无法读取undefined的__proto__属性
也就是说这两个值不存在属性或方法的概念,它们本身就代表着无。
那么现在基本可以知道,在js中,只有两种类型,一种是有值类一种是无值类,有值类都可以通过 __proto__ 最终指向 Object 对象,而无值类就是 null 和 undefined 两种,一种代表空,一种代表未定义。
到了这里,大概明白了 __proto__ 是干什么的了,我并没有给它一个明确的定义,但是我可以简单的说一下它的功能:
- 除了 undefined 和 null 之外的所有值都有 __proto__ 这个值
- 这个 __proto__ 的值最终会指向同一个 Object 对象,例如 : 类似与这样查找最终会中找到 Object 对象: *.__proto.__.__proto.__.***__proto.__
- 某一个值的每一层的 __proto__ 中的方法都可以直接使用,例如: true.__proto__ 中有 toString 方法,那么就可以直接使用这个 true.toString() 方法,再例如 true.__proto.__.__proto.__ 中拥有 hasOwnProperty 这个方法,那么就直接可以使用 true.hasOwnProperty()
原型链(__proto__)的更多相关文章
- 原型prototype、原型链__proto__、构造器constructor
创建函数时,会有原型prototype,有原型链__proto__,有constructor.(构造函数除外,没有原型) . prototype原型:是对象的一个属性(也是对象),使你有能力向对象添加 ...
- javascript原型链__proto__属性的理解
在javascript中,按照惯例,构造函数始终都应该以一个大写字母开头,而非构造函数则应该以一个小写字母开头.一个方法使用new操作符创建,例如下面代码块中的Person1(可以吧Person1看做 ...
- 原型prototype与原型链__proto__
在 javascript 中我们会约定俗成,如果一个方法是被 new 出来使用的,那么该方法名首字母通常会大写,例如下面代码块中的 Person. var Person = function(name ...
- Javascript中的原型链,__proto__和prototype等问题总结
1.js中除了原始数据类型 都是对象. 包括函数也是对象,可能类似于C++函数对象把 应该是通过解释器 进行()操作符重载或其他操作, 用的时候把它当函数用就行 但是实际上本质是一个对象 原型也是一个 ...
- javascript 原型及原型链的初步理解
最近折腾了好久,终于是把js里面的原型和原型链做了个初步的理解: 在这里,我打个比喻: 我(child),我妈constructor(构造函数)生了我:别人问我老妈跟谁生的我,于是此时我妈会指向我爸爸 ...
- 用hasOwnProperty获取对象自身的属性排除原型链
今天遇到一个多层级的object. 需要判定每一层级的data下是否有title属性.在下图中展开的data自身其实是没有title的,但由于受到原型链__proto__的影响,在获取parent.d ...
- JS面向对象组件(二)--Javascript原型链
原型链 : 实例对象与原型之间的连接,叫做原型链 –__proto__( 隐式连接 ),这就是原型链,平时我们是看不到的. 原型链的最外层 : Object.prototype function Aa ...
- [转] Javascript 原型链
1. 类 在C或者Java里,int a;定义了一个int类型的变量a.其中int是类型的名字,a是具体的变量. Javascript 模仿自 Java, 有一部分面向对象编程的部分.在面向对象的编程 ...
- _proto_ && prototype (原型 && 原型链)
原型一直都是JavaScript基础里面的痛点,因为在JavaScript里面没有类的概念,都是通过原型对象来实现继承,下面的这个图很好的说明几者之间的关系! a.__proto__ = A.prot ...
- 小谈js原型链和继承
原型(prototype)在js中可是担当着举足轻重的作用,原型的实现则是在原型链的基础上,理解原型链的原理后,对原型的使用会更加自如,也能体会到js语言的魅力. 本文章会涉及的内容 原型及原型对象 ...
随机推荐
- Linux下安装yum工具
Linux下安装yum工具 http://blog.csdn.net/caoshichaocaoshichao/article/details/13171919
- [转]Permission denied: /.htaccess pcfg_openfile: unable to check htaccess file, ensure it is readable
原文链接:http://blog.csdn.net/dyw/article/details/6612497 近日,在Apache2环境下部署Rails3应用时碰到此错误: Permission den ...
- FireMonkey下的异形窗体拖动(句柄转换)
DelphiXE2 Firemoney FMX 的窗体不只是为windows的, 所以很多功能都没有了. 最常见的就是拖拽了 先看 VCL时代 一个经典拖动代码 ReleaseCapture(); S ...
- QPointer更安全,QScopedPointer自动出范围就删除,QSharedDataPointer帮助实现隐式共享
http://blog.csdn.net/hai200501019/article/details/8474582http://blog.csdn.net/hai200501019/article/d ...
- iTextSharp - 建立PDF文件
原文 iTextSharp - 建立PDF文件 01 using iTextSharp.text; 02 using iTextSharp.text.pdf; 03 ... 04 private vo ...
- uva 10313 Pay the Price(完全背包)
题目连接:10313 - Pay the Price 题目大意:有0~300这300种价值的金额. 现在可能给出参数: 1个:n, 输出可以组成价值n的方式的个数. 2个:n, a输出用个数小于a的价 ...
- ajaxSubmit提交文件表单不执行success
先描述一下我遇到的问题,系统里所有的表单都用ajaxSubmit来提交,成功回调success函数,普通表单都是没有问题的,但是有文件上传的表单就不行了,不会回调success,经验证会回调compl ...
- 关于android中postDelayed方法的讲解
这是一种可以创建多线程消息的函数使用方法:1,首先创建一个Handler对象 Handler handler=new Handler(); 2,然后创建一个Runnable对象Runnable run ...
- CLR执行模型 流程总结(图)
如有错误,还望指出:
- iOS - 单例传值 (一)
点击打开链接 iOS - 单例传值 (二) 单例只会对某个类实例化一次/单例类,对单例这个类实例化一次有且仅有一个对象 你单例初始化,只能初始化一次,然后你指向的对象,其实都是指向一个内存地址, ...