改變__proto__:為什麼效能會受到影響
JavaScript 中proto 屬性的文件強烈建議不要修改[ [物件的原型]],因為它對效能有不利影響。這是因為,與向 Function.prototype 添加屬性相反,更改物件的原型對現代 JavaScript 實作具有深遠的影響。
考慮以下範例:
<code class="javascript">function Foo(){} function bar(){} var foo = new Foo(); // This is bad: //foo.__proto__.bar = bar; // But this is okay Foo.prototype.bar = bar; // Both cause this to be true: console.log(foo.__proto__.bar == bar); // true</code>
雖然兩種方法都會產生結果當 foo.__proto__.bar 設定為 bar 時,它們對效能的影響有很大不同。重新分配 Foo.prototype.bar 是可以接受的,但強烈建議不要直接更改 foo.__proto__.bar。
理解這種效能損失的關鍵在於 JavaScript 引擎採用的內部最佳化。當存取物件的屬性時,引擎會根據類型和結構推斷進行最佳化。然而,[[Prototype]] 的任何突變都會使這些最佳化失效,迫使引擎退回到較慢的非最佳化程式碼路徑。
出現這種效能損失是因為更改物件的原型本質上交換了其內部類型,破壞預編譯程式碼並刷新屬性查找最佳化。因此,現代 JavaScript 實作中的後續執行不可避免地會變慢。
此外,值得注意的是,此類原型突變也可能導致類型混淆危險,使腳本行為的推理變得更具挑戰性,並在 VM 和 中引入複雜性。 JIT 實施。因此,建議透過 Object.create() 建立具有不同原型鏈的新對象,而不是改變現有原型。
以上是為什麼改變 __proto__ 會導致 JavaScript 效能下降?的詳細內容。更多資訊請關注PHP中文網其他相關文章!