【发布时间】:2012-01-14 20:34:43
【问题描述】:
是否有可能在 IE9 或 IE10 中更改对象的 __proto__ 属性?
还是 MS 仍然不打算将其包含在他们的 JS 引擎中?
我在非常特殊的情况下需要它,我需要在创建对象之后更改__proto__。
【问题讨论】:
标签: javascript internet-explorer prototype
是否有可能在 IE9 或 IE10 中更改对象的 __proto__ 属性?
还是 MS 仍然不打算将其包含在他们的 JS 引擎中?
我在非常特殊的情况下需要它,我需要在创建对象之后更改__proto__。
【问题讨论】:
标签: javascript internet-explorer prototype
由于您的问题没有具体说明,我不确定您到底在追求什么,但对于 proto 的大多数用途,您应该可以使用 prototype。
var foo = new Bar();
//this also affects foo
Bar.prototype.baz = something;
【讨论】:
不得已,不得已:
更改您的代码,以便通过更改后的原型访问的所有属性现在都可以通过普通属性的显式委托访问:
{
a: 17,
__proto__: { ... }
}
到
{
a: 17,
proto: {...}
}
【讨论】:
__proto__ 将在 ES6 中标准化。它目前在Appendix B of the ES6 draft 中,这实际上意味着如果实现它,它需要具有以下语义。
__proto__ 都可以作为Object.prototype 上的访问器使用,这意味着默认情况下所有对象都可以读取和写入它。但是,它可以从Object.prototype 中删除(使用delete)。删除后,__proto__ 将作为普通数据属性使用,对设置没有副作用。
__proto__ 也是对象字面量中的一种特殊句法形式。即使Object.prototype.__proto__ 被删除,它也可以设置[[Prototype]]。
ES6 还引入了Object.setPrototypeOf(不在附录中)。这优于设置__proto__。
__proto__ 在所有现代浏览器中都可用,including Internet Explorer 11。
【讨论】:
__proto__ 包含在泄露的 Windows Blue 版本中的 IE11 中:http://fremycompany.com/BG/2013/Internet-Explorer-11-rsquo-s-leaked-build-395/
【讨论】: