标签:
原本标题叫"如何快速的理解protoype/proto-chain",写了不少篇幅
始终觉得过于笼统,且不利于自己深入理解
为了食髓知味
拆分成几个篇章来研究,但求短小精悍
本篇主讲概念
起跑:
prototype 原型:
一个函数对象才有prototype属性,普通对象是没有的(不具备生育能力)
在函数对象被创建时,prototype同时被创建
之后这个函数对象new出来的所有对象,都会继承了prototype里的变量与方法
__proto__ 原型链引用(指针)
需要值得注意的是
a.一个普通对象的__proto__指向的是它的构造函数的prototype
b.一个函数对象的prototype的__proto__默认是object{},即:由function Object()的原型
c.Object.prototype._proto_===null
一言蔽之,__proto__一定指向另一对象的prototype或者null
万物生于null
一个常见的原型链,即是从一个普通对象—>构造函数原型—>ObJect函数原型—>null
加速:
让我们加点料
var People = function(name){
this.name=name
};
var p1 = new People(‘alex‘);
p1.__proto__===p1.constructor.prototype ;//true
p1.__proto__.__proto__===p1.constructor.prototype.constructor.prototype;//false
p1.__proto__.__proto__ ;//Object {}
p1.constructor.prototype.__proto__;//Object {}
p1.constructor.__proto__;//function Empty()
注意到这里的Empty();
对于任何Fnobj,FnObject.prototype.__proto__ 与FnObject.__proto__ 是不一样的
任何FnObject.__proto__==Function.prototype
Function.prototype //function Empty()
学到这里我们不停在js中印证着:万物皆对象
函数对象,也依然是对象
挣扎:
可是问题又来了
Function.constructor //function Function()
Function.__proto__ //function Empty()
Function.__proto__===Function.prototype;//true 这个十分有趣
Function.__proto__.prototype===Function.prototype.__proto__;//false 这个理所应当,因为普通对象不存在在prototype
Function对象,即使找几次constructor都是function Funcition()
这有些无性繁殖或者自交的味道
让人想起被缚的普罗米修斯,活在轮回之中
通往上层的引用在于Function的__proto__和prototype
而无论它的的原型还是还是原型指针都指向function Empty()
追寻本质:
Function.prototype.constructor //function Function() 死胡同...
Function.__proto__ //function Empty()
Function.__proto__.__proto__ // Object{}
Function.__proto__.__proto__ .__proto__ //null
到了这里,一切亲切又自然
又回到Object{}->null的怀抱
标签:
原文地址:http://www.cnblogs.com/AlexNull/p/4829709.html