__proto__似乎不能在null赋值后工作- bug或特性
__proto__ doesn't seem to work after a null assignment - bug or feature?
我观察到关于__proto__
的行为,这对我来说似乎很奇怪:当将__proto__
更改为各种对象时,它的行为如预期的那样,但是一旦设置为null
,将其再次更改为另一个对象似乎没有效果。
这是实现中的错误,还是期望的行为?如果这是理想的行为,有人能解释一下为什么吗?
一个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;不知道其他浏览器的反应
问题是Firefox中的__proto__
是Object.prototype
上的实际属性,使用getter/setter
函数实现。因此,当您将o
的__proto__
设置为null
时,您将删除整个原型链,其中包括__proto__
属性。
现在,当你给__proto__
赋值时,你只是直接给o
对象赋了一个新的、正常的、没有预期行为的属性。
所以为了获得__proto__
的功能,你需要去Object.prototype
,借用__proto__
属性的.set
方法,使用.call
允许它对o
对象进行操作。
Object.getOwnPropertyDescriptor(Object.prototype, "__proto__").set.call(o, p);
因此,使用.call
调用Object.prototype.__proto__
的set
函数,使o
成为set
的this
值,而p
是正在设置的值。这将使__proto__
对o
进行操作,就好像它是o
的属性一样,允许它设置[[Prototype]]
的内部属性。
相关文章:
- Javascript:selenium Web驱动程序isDisplayed()不工作
- jQuery UI自动完成突然停止工作
- AngularJS UI路由器不能像ng路由器那样工作
- HTML5音频加载和播放获胜'我不能在iPad上工作
- JavaScript打印功能使日历停止工作
- Javascript.getHours()工作不正常
- 为什么这在IE中的工作方式与在Firefox中不同
- 视频HTML没有'无法在Internet Explorer 11上工作
- 扩展移相器按钮类不工作
- Ruby on rails,ajax on pagination bug,在更改站点之前工作
- jQuery parent();函数removeClass();不工作(bug)
- Jquery AJAX工作,但显示的消息有bug
- jQuery的preventDefault()没有像我期望的那样工作——这是jQuery的Bug吗?
- ie浏览器bug!仅当搜索按钮按下时工作(输入不工作)
- 确定一个bug是浏览器的错误还是我自己的错误的工作流程是什么?
- 猫头鹰旋转木马2不工作与循环和1项(Bug修复现在)
- jQuery的实时邮件验证不工作,我找不到bug
- __proto__似乎不能在null赋值后工作- bug或特性
- 谷歌浏览器-这是一个BUG吗?Javascript的问题?触摸屏输入不工作
- 需要帮助查找jquery $(document).ready()在firefox中不能正常工作的bug