首頁  >  文章  >  web前端  >  為什麼修改物件的 [[Prototype]] 是 JavaScript 中的效能殺手?

為什麼修改物件的 [[Prototype]] 是 JavaScript 中的效能殺手?

Barbara Streisand
Barbara Streisand原創
2024-10-30 20:09:03474瀏覽

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 實現起來非常痛苦......並且它會造成各種類型混淆的危險。並使VM、JIT 和分析實現變得更加複雜和錯誤。 "
  • 的影響很明確:改變物體的[[Prototype]] 會破壞性能優化,應該避免。相反,使用 Object.create() 建立具有獨特原型鏈的新物件是首選方法。

以上是為什麼修改物件的 [[Prototype]] 是 JavaScript 中的效能殺手?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn