原型、原型链、Function、Object、对象、函数的爱恨情仇
这篇文章不会仔细阐述函数属性prototype、__proto__来源作用等基础知识,所以请确保你有相关基础。
要点
一、__proto__指向本对象的构造函数的原型(prototype)
二、所有构造器函数都来源于Function.prototype
三、js中所有事物都是对象,所有对象都来源于Object.prototype
这是解开笔者原来关于原型链的疑惑的关键三点,下面分别阐释各要点的含义。
第一点阐释
var person = function(){}
var p = new person()
那么就有
p.__proto__===person.prototype
但是person.__proto__上面又指向谁呢?
这就要说第二点了
第二点阐释
我们所常见的构造器函数有Array()、String()、Number()、Object()等,她们在原型链中有如下表现
Array.__proto__===Function.prototype //true
String.__proto__===Function.prototype //true
Number.__proto__===Function.prototype //true
Object.__proto__===Function.prototype //true
甚至是Function本身也是如此
Function.__proto__===Function.prototype //true
这就很好地说明了:所有构造器函数都来源于Function.prototype
还顺便解释了一些不合常理的等式
Function.__proto__===Object.__proto__
第三点阐释
关于这一点有如下表现
Function.prototype.__proto__===Object.prototype //true
追溯到最顶层就是原型链的终点null了
Object.prototype.__proto__===null //true