为什么修改对象的 [[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 引擎利用隐藏类来优化属性查找。更改原型链会使这些优化失效,迫使引擎回退到效率较低的方法。
该领域的专家对可变原型的性能影响表示担忧:
的影响很明确:改变对象的 [[Prototype]] 会破坏性能优化,应该避免。相反,使用 Object.create() 创建具有独特原型链的新对象是首选方法。
以上是为什么修改对象的 [[Prototype]] 是 JavaScript 中的性能杀手?的详细内容。更多信息请关注PHP中文网其他相关文章!