首页  >  文章  >  web前端  >  为什么修改对象的 [[Prototype]] 是 JavaScript 中的性能杀手?

为什么修改对象的 [[Prototype]] 是 JavaScript 中的性能杀手?

Barbara Streisand
Barbara Streisand原创
2024-10-30 20:09:03473浏览

Why is Modifying an Object's [[Prototype]] a Performance Killer in JavaScript?

为什么修改对象的 [[Prototype]] 会成为性能杀手?

Mozilla 开发者网络 (MDN) 强烈建议不要更改对象的 [[Prototype]] 性能杀手?对象的 [[Prototype]],无论使用哪种方法。此警告源于它对现代 JavaScript 实现造成的严重性能损失。

虽然建议通过 Function.prototype 将成员函数添加到 JavaScript 类,但以下操作:

foo.__proto__.bar = bar;
Foo.prototype.bar = bar;

功能上等效,并在 Object.getPrototypeOf(foo)` 对象上创建一个 'bar 属性。

问题不在于创建 'bar` 属性,而是分配给 '__proto__ 属性本身:

fred.__proto__ = Object.prototype;

此操作破坏了属性访问的 JavaScript 引擎优化。通过修改现有对象的原型链,您可以有效地破坏之前的所有优化工作。

例如,V8 JavaScript 引擎利用隐藏类来优化属性查找。更改原型链会使这些优化失效,迫使引擎回退到效率较低的方法。

该领域的专家对可变原型的性能影响表示担忧:

  • Brendan Eich:“可写 proto 实现起来非常痛苦......并且它会造成各种类型混淆的危险。”
  • Brian Hackett:“允许脚本改变原型......使得推理脚本的行为变得更加困难,并使 VM、JIT 和分析实现变得更加复杂和错误。”
  • Jeff Walden:“创建后的原型突变,及其不稳定的性能不稳定,以及对代理和 [[SetInheritance]]"

的影响很明确:改变对象的 [[Prototype]] 会破坏性能优化,应该避免。相反,使用 Object.create() 创建具有独特原型链的新对象是首选方法。

以上是为什么修改对象的 [[Prototype]] 是 JavaScript 中的性能杀手?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn