【问题标题】:JavaScript Why manipulating __proto__ is slow? [duplicate]JavaScript 为什么操作 __proto__ 很慢? [复制]
【发布时间】: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


【解决方案1】:

我想知道为什么变异实例的 proto 是一个缓慢的操作。

在您的浏览器中实现 JavaScript 语言的人做出了权衡:他们希望支持这种“深奥”的功能,但通过减慢这种操作速度来加快语言的其余部分。

您应该只在编写程序后担心__proto__ 的速度。对于许多用例来说,额外的“缓慢”只会导致整个程序出现几毫秒的差异,没人会在意。

【讨论】:

  • [...] but made the rest of the language faster by making this manipulation slower.:你到底是什么意思? :o 好吧,但我仍然想知道“为什么/如何”在算法上很慢。感谢您的回答。
  • 我不知道具体情况。想象一下,如果语言将__proto__ 复制到每个对象,这样访问速度就会非常快。如果你更改__proto__,那会很慢,因为它需要更新每个对象。 (我不认为这就是他们所做的,但这就是语言所做的权衡。)
  • 我明白了。事实上,他们试图阻止手动设置__proto__,因为人们可以对其进行任何设置并破坏整个原型理念。好的,谢谢你的帮助。 :) 所以我们只有在没有其他选择的情况下才能修改它。
猜你喜欢
  • 2011-11-15
  • 2020-07-16
  • 1970-01-01
  • 1970-01-01
  • 2019-10-02
  • 2010-10-30
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多