在当前的 Ecmascript 6 草案(2012 年 11 月)中,官方支持该__proto__
属性(第 B.3.1 节)。这有点令人惊讶,因为在当前的浏览器实现中,该__proto__
属性已被弃用。
如果当前草案成立,ES6 会完全支持可变原型吗?我能否像目前在 Firefox 中那样为现有对象提供新原型?
在当前的 Ecmascript 6 草案(2012 年 11 月)中,官方支持该__proto__
属性(第 B.3.1 节)。这有点令人惊讶,因为在当前的浏览器实现中,该__proto__
属性已被弃用。
如果当前草案成立,ES6 会完全支持可变原型吗?我能否像目前在 Firefox 中那样为现有对象提供新原型?
目前,计划将 mutable__proto__
放在规范中(而不仅仅是在附件 b 中)。目前的计划是让它成为一个神奇的数据属性,仅存在于 Object.prototype 上并充当访问器(神奇的部分)。此属性也将是可删除的,删除__proto__
时删除该领域的变异能力。我已经__proto__
在我的 ES6 虚拟机http://benvie.github.com/continuum中实现了这个描述。
最初它要被弃用和替换,但没有就替换达成共识。从内置继承的能力是最终目标,并且决定__proto__
是已经广泛传播(除了即拥有它之外的所有东西)并实现了这个目标,因此阻力最小的路径是接受和编码它。
根据 Ecmascript 6 发布的文档,__proto__
仍然存在,但正如Bergi和MattBrowne在上述解决方案中指出的那样,我们可以Object.setPrototypeOf
使用__proto__
.
当使用参数 O 和 proto 调用 setPrototypeOf 函数时,将执行以下步骤:
- 令 O 为 RequireObjectCoercible(O)。
- ReturnIfAbrupt(O)。
- 如果 Type(proto) 既不是 Object 也不是 Null,则抛出 TypeError 异常。
- 如果 Type(O) 不是 Object,则返回 O。
- 让状态为 O.[SetPrototypeOf]。
- ReturnIfAbrupt(状态)。
- 如果 status 为 false,则抛出 TypeError 异常。
- 返回 O。