【发布时间】:2014-03-17 10:45:30
【问题描述】:
与此线程相关:JavaScript better way to modify function prototype,我想知道为什么改变实例的 __proto__ 是一个缓慢的操作。
我知道它已被弃用,我经常在网上阅读它。但我一直没有找到原因。为什么它真的被弃用了,为什么它很慢?
setPrototypeOf() 会是一个更好的解决方案,就性能而言?
【问题讨论】:
-
它实际上已不再被弃用,出于兼容性原因,它已在 ES6 中重新引入。 一般应该避免。假设您有一个
Animal,而Dog是一种动物。__proto__让你做的是声明“这只狗不再是动物”,这完全打破了面向对象的设计。它有一些有用的情况(比如说“不再是 NodeList,而是像 Zepto 那样的数组),但这些情况很少见,在我看来通常是不合理的。 -
这里是 ES6 specification of
__proto__by the way,这里是语言创建者和 Mozilla 首席技术官 Brendan Eich mail.mozilla.org/pipermail/es-discuss/2010-April/010917.html 反对它的论点 -
好吧,但我还是想知道为什么说它慢。 ;) 虽然我很理解它破坏了 OO 设计。但是,如果我的“对象”是一个函数(如相关线程中所述)并且我不想修改
Function.prototype,则除了设置__proto__之外,我没有其他解决方案。谢谢! -
你能让你的“类”一次性工作吗,比如 this.bundle.name 而不是 this.name?这样,您可以将捆绑包保留为 vanilla 对象并随时交换实现,而不会终止运行时优化。只要所有可互换的方法都知道并使用“.bundle.”,它几乎和聚合类型“hotswap”一样方便,而且没有成本。
标签: javascript prototype