js:原型/原型链,first chasing

原本标题叫"如何快速的理解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的怀抱

原文地址:https://www.cnblogs.com/AlexNull/p/4829709.html