Перейти к содержимому

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 miss
function 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 с одинаковой структурой → одна Map
const makePoint = (x, y) => ({ x, y }); // всегда Map{x,y}
// vs ({ ...data }) — форма зависит от содержимого data

Итог: Hidden classes — внутренний механизм V8 для O(1) доступа к свойствам; единственная форма объекта (monomorphic) критична для производительности hot paths; поддержание единого порядка инициализации свойств — обязательное правило.