我已经阅读了 V8 中的隐藏类,并在 d8 调试器 shell 中进行了一些测试。
function Vector(a, b) {
this.a = a;
this.b = b;
}
var x = new Vector(1, 2);
var y = new Vector(1, 3);
var z = new Vector(1, 'a');
print( %HaveSameMap( x, y ) ); //true
print( %HaveSameMap( x, z ) ); //false
x.b;
print( %HaveSameMap( x, z ) ); //true
print( %HaveSameMap( y, z ) ); //false
y.b;
print( %HaveSameMap( y, z ) ); //true
Run Code Online (Sandbox Code Playgroud)
正如我们所看到的,如果对象属性类型不同,它们不会共享它们的隐藏类,直到我们尝试访问类型不同的 Elder 对象中的属性。任何人都可以清楚地解释“幕后”发生了什么,也许它与内联缓存有关。