__proto__ VS.JavaScript 中的原型

此图再次显示每个对象都有一个原型。构造函数 Foo 也有自己的函数.prototype,反过来,它也通过其属性再次引用 Object.prototype。因此,重复一遍,Foo.prototype只是Foo的显式属性,它指的是b和c对象的原型。__proto____proto__

var b = new Foo(20);
var c = new Foo(30);

和 之间有什么区别?__proto__prototype

enter image description here

这个数字取自 dmitrysoshnikov.com

注意:上述2010年文章现在有第2版(2017年)。


答案 1

__proto__是在查找链中用于解析方法等的实际对象。 是使用 以下项创建对象时用于生成的对象:prototype__proto__new

( new Foo ).__proto__ === Foo.prototype
( new Foo ).prototype === undefined

答案 2

prototype是函数对象的属性。它是该函数构造的对象的原型。

__proto__是对象的内部属性,指向其原型。目前的标准提供了一种等效的方法,尽管事实上的标准更快。Object.getPrototypeOf(obj)__proto__

您可以通过将函数与对象链进行比较来查找关系,并且可以通过更改 来断开这些关系。instanceofprototype__proto__prototype

function Point(x, y) {
    this.x = x;
    this.y = y;
}

var myPoint = new Point();

// the following are all true
myPoint.__proto__ == Point.prototype
myPoint.__proto__.__proto__ == Object.prototype
myPoint instanceof Point;
myPoint instanceof Object;

这是一个构造函数,它按过程构建一个对象(数据结构)。 是 so 在那时被保存到 的对象。PointmyPointPoint()Point.prototypemyPoint.__proto__