5

在当前的 Ecmascript 6 草案(2012 年 11 月)中,官方支持该__proto__属性(第 B.3.1 节)。这有点令人惊讶,因为在当前的浏览器实现中,该__proto__属性已被弃用。

如果当前草案成立,ES6 会完全支持可变原型吗?我能否像目前在 Firefox 中那样为现有对象提供新原型?

4

2 回答 2

8

目前,计划将 mutable__proto__放在规范中(而不仅仅是在附件 b 中)。目前的计划是让它成为一个神奇的数据属性,仅存在于 Object.prototype 上并充当访问器(神奇的部分)。此属性也将是可删除的,删除__proto__时删除该领域的变异能力。我已经__proto__在我的 ES6 虚拟机http://benvie.github.com/continuum中实现了这个描述。

最初它要被弃用和替换,但没有就替换达成共识。从内置继承的能力是最终目标,并且决定__proto__是已经广泛传播(除了即拥有它之外的所有东西)并实现了这个目标,因此阻力最小的路径是接受和编码它。

于 2012-12-12T14:14:12.990 回答
1

根据 Ecmascript 6 发布的文档,__proto__仍然存在,但正如BergiMattBrowne在上述解决方案中指出的那样,我们可以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。
于 2015-06-24T06:21:13.780 回答