我读了一个article,它解释了什么是原型链。
它说,如果我试图访问一个对象的属性,但它没有,javascript引擎将尝试它的.constructor.propotype。如果它也没有,那就试试.construtor.propotype.constructor.propotype吧。直到它找到内置对象()。
但我测试了一下:
function a() {}
b = new a();然后:
c = b.constructor.prototype我得到一个空的a对象。
然后:
d = c.constructor.prototype我得到一个空的a对象。
它会循环。无论我调用多少个.constructor.prototype,它都找不到Object()。怎么了?我误解了原型链吗?
发布于 2011-06-08 19:58:05
在JS OOP中,constructor和prototype属性很不稳定,因为在您执行继承时没有为您设置它们。您应该手动设置/更改它们以实现继承。例如,请参见this tutorial。
看起来你试图爬上原型链的方式(通过遍历.constructor.prototype)永远不会真正到达Object的顶层原型,因为当你有function a(){}时,正确的constructor和prototype属性并没有设置在一个上。我甚至不能设法将它们强制到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进行查找,它在内部保存每个实例的原型。因此,如果使用.__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__弃用。
发布于 2011-06-08 19:11:02
看起来我问了一个愚蠢的问题。
如果A是一个函数:
A.prototype.constructor === A
如果A不是一个函数:
普通属性中的A.prototype。
所以(在标准情况下)没有办法爬上原型链。
https://stackoverflow.com/questions/6276581
复制相似问题