原型链的顶端是什么

js中到处是对象,对象之间往往会通过__proto__连接在一起,这种链接的现象被称为原型链。极少数的对象会滑原型,比如:
Object.create(null)生生的对象里面没有任何属性,非常“空”,我们称它为字典,这种字典对象适合存放数据,不必担心原型带来的副作用。
对象生的有三种方式,一种是上面的Object.create(),一中是字面量(var a = {}),另外一种是通过构造函数(var person = new Person())。一般的对象它们的原型链的顶点是Object.prototype。通过构造函数形式产生的对象,它们的__proto__会自动关联构造函数的prototype。

而构造函数的prototype是什么,它的原型链最终又指向了哪里呢?这个问题的答案是:函数的prototype是一个在函数声明阶段就会产生的对象(prototype只有函数才会有),这个对象只有两个属性constructor和__proto__,其中__proto__指向了我们原型链的顶点Object.prototype。constructor指向函数本身,里面包括了函数一些基本描述信息比如函数名称,参数个数等。

有意思的是constructor里面即有__proto__又有prototype,他们之间有什么关系和差别呢?首先prototype描述的是原型对象,它是一个实实在在的对象,__proto__是用来描述对象间的关联关系的。最终会指向一个prototype原型。函数由Function衍生而来,所以函数的__proto__指向的是Function.prototype。Function是由Object衍生而来,有意思的事情又发生了,Function的__proto__却并不指向Object.prototype,而是指向Function.prototype这个标准的内置对象。Function.prototype.__proto__才是指向我们的原型链顶点Object.prototype

Function.__proto__ === Function.prototype // true

在这里插入图片描述
在函数当中,Function.proto === Function.prototype

你可能感兴趣的:(javascript)