上文 v8 中快属性和慢属性讲到快属性和慢属性,搞清楚了 v8 中对象的属性查问是怎么样的。明天来看看为了放慢对象的查问,v8 还做了什么事件。
暗藏类
还是拿上面的构造函数来举例子
function Foo(elNum, pNum) {for (let i = 0; i < elNum; i++) {this[i] = 'ele' + i;
}
for (let i = 0; i < pNum; i++) {this['pp' + i] = 'property' + i;
}
}
var a = new Foo(10, 10);
var b = new Foo(10, 10);
var c = new Foo(20, 10);
var j = new Foo(0, 10);
上述的实例中,咱们看看它们的暗藏类是什么,elements 和 properties 哪些会影响暗藏类的形态。
咱们能够看到全副对象的 map 的指向都是 @141629,阐明下面几个对象的暗藏类是指向同一个。阐明了 elements 的个数不影响暗藏类,暗藏类只记录 properties 的形态。
咱们当初给 a 增加一个字段,看看暗藏类会有什么变动。
![image.png](/img/bVcKqx2)
a.ppCustom = 'property comstom';
因为我刷新了页面,所以这里指向产生了变动,不过咱们只看绝对变动就能够。b/c/ j 的 map 都指向了 @151345,而 a 的 map 变成了 @151391。产生了变动,阐明当对象的形态产生了变动的时候,暗藏类须要对应生成一个新的。
然而因为 v8 引擎思考到了开发的时候既然会减少属性,也会有可能删除属性,所以 map 中有一个 back_pointer 字段,指向上一次 map 的地址
看看 a 的 map 的 back_pointer,指向了 @151345,跟大家的是一样的。如果后续执行又把 ppCustom 删除了,那么会沿着 back_pointer 链寻找匹配的暗藏类,如果匹配到则应用该暗藏类,防止了频繁增删属性导致频繁的生成新的暗藏类。