上一篇介绍了最基本的原型链,并触发了一系列的疑问本篇解决原型的__proto__属性又指向谁。
1. 字面量创建对象
通过字面量创建对象 let = {}; 和通过构造函数创建的对象(实例对象)又有什么区别呢?其实通过let a = new Object(); 创建对象是一样的,字面量的形式是new 创建对象的语法糖,相同数组和函数也可通过new创建
例如:
let arr = new Array(); let fn = new Function(‘var a = 1;’)
(这里就不对参数的传递对过多的说明,在后续文章中介绍)
回到上文,字面量创建对象是通过new Object创建的,回顾上一篇,那么是否通过字面量创建也能形成原型链的三角关系呢?答案是肯定的
2. 揭露原型对象真实的面目
通过上面的分析只要是一个对象就会又原型链的三角关系,那么原型对象作为一个对象时又是通过谁 new 出出来的呢?、
;可以看除出构造函数的原型对象上的__proto__属性指向的是 Object原型对象上,而Object原型对象和Object分别通过prototype属性和constructor属性来相互的指向。那么按照这样的解释,Object的原型对象上也有__proto__属性哪有指向哪里呢?那么他身上还有__proto__属性,难道就这样一直指向下去吗?这引发了我们的深思。
3. 从错误中引发的深思
相信很多人每天都会遇到的这样的一类的错误,例如无法从undefiend,nulll身上读取到某某属性,而null,undefiend身上有__proto属性吗?那如果没有是不是就可以让上诉的__proto__属性一直指向下去的问题解决呢?结果是正确的。Object的原型对象上的__proto__属性指向null,从而不会一直指向下去。
4. 图解
经过上面的一系列的分析得出下图的原型链
5. 深思
但是引起了我们的深思Object构造函数也是一个对象他也有__proto__属性,那么他的__proto__属性有指向哪里呢?还有上一篇的构造函数的__proto__属性指向哪里呢?
关注笨笨的熊