IE9或IE10的__proto__问题

5

在IE9或IE10中有没有可能更改对象的__proto__属性? 还是微软仍然没有计划将其包含在他们的JS引擎中?

我需要在一个非常特殊的情况下改变__proto__对象创建后。

4个回答

12

__proto__将在ES6中标准化。它目前在 ES6草案的附录B中,这意味着如果它被实现,它需要具有以下语义。

__proto__作为Object.prototype上的访问器可用,这意味着所有对象默认都可以读取和写入它。但是,可以从Object.prototype中删除它(使用delete)。一旦删除,__proto__将作为普通数据属性工作,设置时没有副作用。

__proto__也是对象字面量中的特殊语法形式。即使删除了Object.prototype.__proto__,它也将起到设置[[Prototype]]的作用。

var p = {a: 1};
var o = {
  __proto__: p,
  b: 2
}
ES6还引入了Object.setPrototypeOf(不在附录中)。这比设置__proto__更受欢迎。 __proto__在所有现代浏览器中都可用,包括Internet Explorer 11

我希望这是真的。你知道ES6是否允许有效地从数组派生吗? - Jean Vincent
proto 不在标准轨道上 - 相反,ES6 批准了 Object.setPrototypeOf 以获得更好的支持。https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/proto - Angelos Pikoulas
是的,ES6将支持对内置原生类(如Array)进行子类化。 - Brian Di Palma

2

1

最后的无奈之举:返回一个非答案。

修改您的代码,使得所有原本通过更改原型访问的属性现在都通过普通属性的显式委托进行访问:

{
   a: 17,
   __proto__: { ... }
}

{
   a: 17,
   proto: {...}
}

0

我不确定你具体需要什么,因为你的问题没有说明,但对于大多数proto的用途,你应该能够使用prototype

var foo = new Bar();
//this also affects foo
Bar.prototype.baz = something;

我没有具体说明,因为我想知道的唯一一件事是IE9/10是否支持修改__proto__属性,因为它是目前唯一不支持它的浏览器。 - Van Coding
我不理解 "new Bar();"。你如何使用Object.create重写它? - Phillip Senn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接