在目前的Ecmascript 6草案(2012年11月)中,官方支持__proto__
财产(B.3.1节)。这有点令人惊讶,因为在当前的浏览器实现中,不推荐使用__proto__
属性。
如果目前的草案成立,ES6是否会全力支持可变原型?我是否能够像目前在Firefox中一样为现有对象提供新原型?
答案 0 :(得分:8)
目前,计划将可变__proto__
列入规范(而不仅仅是附件b)。目前的计划是它是一个神奇的数据属性,仅存在于Object.prototype上并充当访问者(神奇的部分)。此属性也将是可删除的,删除了在删除时改变该域的__proto__
的功能。我在ES6虚拟机http://benvie.github.com/continuum中按照此说明实现了__proto__
。
最初它被弃用并取代,但没有就该替代品达成共识。从内在继承的能力是最终目标,并且决定__proto__
已经普及(除了它之外的所有东西)并且实现了这个目标,因此阻力最小的路径是接受并编纂它。
答案 1 :(得分:1)
根据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。