我读了一篇 article这解释了什么是原型(prototype)链。
它说如果我尝试访问一个对象的属性但它没有它,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()。怎么了?我对原型(prototype)链有误解吗?
最佳答案
在 JS OOP 中,constructor
和 prototype
属性不稳定,因为当您执行继承时它们不会为您设置。您应该手动设置/更改它们以实现继承。参见,例如,this tutorial .
看起来您尝试攀登原型(prototype)链的方式(通过遍历 .constructor.prototype
)从未真正到达 Object
顶级原型(prototype),因为当您有 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...
当然,运行时不需要这样做,因为它有对每个对象的实际原型(prototype)的引用。 IE。该语言不会通过 .constructor.prototype
进行查找,它会在内部保存每个实例的原型(prototype)。因此,如果您使用 .__proto__
而不是 .constructor.prototype
,您可以看到查找链是如何工作的:
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__
已弃用。
关于javascript - 原型(prototype)链获取不到Object()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6276581/