上文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链寻找匹配的暗藏类,如果匹配到则应用该暗藏类,防止了频繁增删属性导致频繁的生成新的暗藏类。