Hidden Classes
Hidden classes (внутри V8 называются Maps) позволяют обращаться к свойствам объектов со скоростью полей C++-структур; нарушение формы объекта создаёт новую цепочку Map и переводит Inline Cache в polymorphic/megamorphic режим.
Hidden Class (Map) Transition Tree
new Point() .x = 1 .y = 2
Map0 (empty) ──────→ Map1{x} ──────→ Map2{x,y}
↑
все new Point(x,y) используют Map2 ───┘
НАРУШЕНИЕ: другой порядок свойств → другое дерево:
obj.y = 1; obj.x = 2;
Map0 → Map3{y} → Map4{y,x} ← другая цепочка!
obj2 (Map2) и obj3 (Map4) → IC видит 2 формы → polymorphic
УДАЛЕНИЕ свойства:
delete obj.x ─────────→ “dictionary mode” (slow properties)
HashMap вместо fixed offsets
все IC для этого объекта → megamorphic
// Monomorphic shape — оптимально: одна Map для всех экземпляровclass Point { constructor(x, y) { this.x = x; // всегда одинаковый порядок this.y = y; // → одна Hidden Class для всех Point }}const points = Array.from({ length: 1e6 }, (_, i) => new Point(i, i));// V8 использует одну Map → fast fixed-offset property access
// Polymorphic / Megamorphic — IC cache missfunction makeObj(hasZ) { const o = { x: 1, y: 2 }; if (hasZ) o.z = 3; // разные формы → Map2 и Map3 return o;}function sumXY(o) { return o.x + o.y; // IC: monomorphic → bimorphic → megamorphic}// Практические правила для Hidden Class-friendly кода
// 1. Инициализировать ВСЕ свойства в constructor (даже null/undefined)class Node { constructor(value) { this.value = value; this.next = null; // объявить сразу — не добавлять позже this.prev = null; // одна Map для всех Node }}
// 2. delete → dictionary mode; используйте = undefined вместоconst obj = { x: 1, y: 2, z: 3 };// obj.z = undefined; // Hidden Class не меняется ← GOOD// delete obj.z; // переход в slow mode ← BAD
// 3. Object literal с одинаковой структурой → одна Mapconst makePoint = (x, y) => ({ x, y }); // всегда Map{x,y}// vs ({ ...data }) — форма зависит от содержимого dataИтог: Hidden classes — внутренний механизм V8 для O(1) доступа к свойствам; единственная форма объекта (monomorphic) критична для производительности hot paths; поддержание единого порядка инициализации свойств — обязательное правило.