3

我读了一篇解释原型链是什么的文章。

它说如果我尝试访问一个对象的属性但它没有它,javascript 引擎将尝试它的.constructor.propotype. 如果它也没有,请尝试.construtor.propotype.constructor.propotype。直到找到内置的 Object()。

但我对此进行了测试:

function a() {}
b = new a();

然后:

c = b.constructor.prototype

我得到一个空a对象。

然后:

d = c.constructor.prototype

我得到一个空a对象。

它循环。不管.constructor.prototype我调用多少,它都找不到Object()。怎么了?我误解了原型链吗?

4

2 回答 2

2

在 JS OOP 中,constructorprototype属性是不稳定的,因为在执行继承时它们没有为您设置。您应该手动设置/更改它们以实现继承。例如,请参阅本教程

看起来您尝试攀登原型链的方式(通过遍历.constructor.prototype)从未真正到达Object顶级原型,因为当您拥有function a(){}权限constructor并且prototype属性未设置在 a. 我什至无法强迫他们进入a; 在 Chrome 中我得到:

> function a(){}
undefined
> a.constructor.prototype
function Empty() {}
> a.constructor.prototype = Object.prototype
Object
> a.constructor.prototype
function Empty() {} // hmmmm, the assignment didn't take...

当然,运行时不需要这样做,因为它引用了每个对象的实际原型。即语言不通过 进行查找,它在内部保存每个实例.constructor.prototype的原型。所以你可以看到查找链是如何工作的,而不是你使用:.constructor.prototype.__proto__

function a(){}
b = new a();
b.__proto__ === Object.prototype; // false
b.__proto__.__proto__ === Object.prototype; // true since we reached the top of the prototype chain

需要注意的是,该属性__proto__从来都不是标准的,并且在 ES5 中以稍微不同的方式标准化:

obj.__proto__ === Object.getPrototypeOf(obj);

这会导致.__proto__弃用。

于 2011-06-08T11:58:05.297 回答
1

看来我问了一个愚蠢的问题。

如果 A 是一个函数:

A.prototype.constructor === A

如果 A 不是函数:

A.prototype 中的普通属性。

所以(在标准中)没有办法爬上原型链。

于 2011-06-08T11:11:02.157 回答