一图胜千言。
首先,我的理解__proto__
和 constructor
是对象(函数)的一个属性,类似指针,指向了其他对象。而 xxx.prototype
是一个对象。
- 对象
__proto__
属性的指向这个对象的原型对象,在对象实例化过程中指定。 -
prototype
即为函数对象的原型对象,普通对象没有这个属性。 - 对象
constructor
属性的值是这个对象的原型对象“继承”过来的,所以对象和这个对象的原型对象的constructor
属性 共同指向了这个对象的构造函数。
有点绕,下面举图中 function Foo()
的例子说明。
// 构造函数Foo
function Foo(name) {
this.name = name
};
// 通过Foo构造函数创建出两个对象实例
let f1 = new Foo('f1');
let f2 = new Foo('f2');
// 这两个对象实例都是从Foo构造函数的原型对象继承而来的,它们的原型对象相同,所以__proto__指向也相同。
console.log(f1.__proto__ === f2.__proto__);
// 这两个对象实例的原型对象与构造函数的原型对象相同
console.log(f1.__proto__ === Foo.prototype);
console.log(f2.__proto__ === Foo.prototype);
这篇文章讲得很透彻,包括Object
与 Function
谁先出现的鸡蛋问题。
网友评论