我观察到一个关于__proto__
的行为,这对我来说似乎很奇怪:当将__proto__
更改为各种对象时,其行为与预期相同,但一旦将其设置为null
,将其再次更改为另一个对象似乎没有效果。__proto__似乎无效后分配 - 错误或功能?
这是实施中的错误还是期望的行为?如果这是所期望的行为,有人可以阐明为什么吗?
一个例子JavaScript代码(所有的测试都通过了罚款,直到最后一行):
p = {
sum: function() {
return this.x + this.y;
}
};
o = {
x: 1,
y: 2
};
o.sum(); // As expected: TypeError: o.sum is not a function
// These all behave as expected:
o.__proto__ = p;
o.__proto__; // [object Object]
o.__proto__.sum; // [object Function]
o.sum(); // returns 3 :-)
// These all behave as expected:
o.__proto__ = {};
o.__proto__; // [object Object]
o.sum(); // TypeError: o.sum is not a function
// These all behave as expected:
o.__proto__ = p;
o.__proto__; // [object Object]
o.__proto__.sum; // [object Function]
o.sum(); // returns 3 :-)
// Still behaves more or less as expected:
o.__proto__ = null;
o.__proto__; // undefined (why undefined and not null?)
o.sum(); // TypeError: o.sum is not a function
// Seems fine, until the last line:
o.__proto__ = p;
o.__proto__; // [object Object]
o.__proto__.sum; // [object Function]
o.sum(); // Expected 3, but... TypeError: o.sum is not a function
我用Firefox 28.0工作;不知道其他浏览器如何反应。
您究竟如何运行测试?我的意思是你不能在第一个TypeError之后继续测试,那么你是否再次使用该行注释掉了它? –
@cookie:我在网络控制台上逐行运行它:) – Tom
我看到它发生了。似乎只要您分配'。proto__ = null',原型继承在'o'上永久破坏。在重新分配'p'后,甚至不能使用'.hasOwnProperty()'等本地方法。虽然'__proto__'是非标准的,所以我不知道它可能被称为bug。 –