new Fn(...) vs. Object.create(P)

這篇翻譯自 mraleph文章,順便當作是自己的memo

V8裡物件設計的基礎

在V8裡每個JavaScript物件長的都像這樣

js object

有些重要的事項要先紀錄在這裡:

  • 物件可以有0個物件內屬性空間(in-object property slots)並用字典來處理物件外屬性儲存空間(out-of-object property storage)。這是很普通且慢的一種JavaScript物件表現方式(又稱為字典模式)。快速模式的JavaScript則有0個或以上的物件內屬性空間及利用陣列來處理物件外屬性儲存空間。
  • 越多屬性存在物件內屬性空間越好:他將減少間接存取這些屬性,也不會浪費記憶體空間來處理物件外屬性儲存空間的陣列標頭。
  • 一旦物件被配置後就不可能再增加物件內屬性空間屬性的數量。若程式持續加屬性到一個已經沒有物件內屬性空間的物件,則新增的屬性將會被動態的加到物件外屬性儲存空間 ー 當然,動態增加也消耗很大。這就是為什麽有個好的關於估算一個物件將總共擁有多少屬性的方法非常重要。
  • 隱藏類別(Hidden Class)(又稱為 map)完全描繪了物件的樣板:該物件多大,有哪些屬性,有多少物件內屬性空間已經使用及已使用在哪(對於快速模式的物件)等等。隱藏類別基本上無法變更,每次有新屬性加到該物件時,該物件就會換到新的隱藏類別。

Read More