原型链里那些奇怪的对象属性都是什么

总结一下原型链里的一些基本概念:

首先我们要明确prototype__proto__

  • 每个函数都有一个原型对象属性:prototype,它包含两个成员属性:constructor&__proto__

  • 每个对象都有一个隐藏的__proto__属性,它引用了创建该对象的函数的prototype,即:

    foo.__proto__ === Foo.prototype,这里的__proto__成为”隐式原型”。

自定义函数的prototype

我们已经说过自定义函数都有一个原型对象属性,那 Foo.prototype就应该也有__proto__属性才对,那它的__proto__又是什么呢?

1
2
function Foo(){}
Foo.prototype.__proto__ === Object.prototype;

自定义函数Fooprototype本质上跟var obj= {}一样都是被Object创建的,所以它的__proto__指向Object.prototype

自定义函数的__proto__

自定义函数也是一种对象呀,所以它肯定也有__proto__属性:

1
2
function Foo(){}
Foo.__proto__ === Function.prototype;

为什么呢?想想一般我们怎么创建函数:

1
2
3
4
5
function Foo(x,y){
return x+y;
}
或者(虽然下面这种方式我们不推荐):
var Foo = new Function("x","y","return x+y;")

可以看出,函数Foo是被Function创建出来的,所以Foo__proto__指向Functionprototype

同理:

1
Object.__proto__ === Function.prototype

Object.prototype

再看一个例子:

1
2
var obj = {}; // obj本质上是被Object函数创建的, var obj = new Object();
obj.__proto__ === Object.prototype;

同样,Object.prototype也是一个对象,那么它的__proto__对象又是什么呢?

这里需要注意的是:Object.prototype__proto__指向的是null

Object的__proto__

1
Object.__proto__ === Function.prototype

最后贴一张图:

原型链