我找到的所有关于 V8 和单态/多态的文章都只提到对象的形状应该保持不变,因此 JIT 编译器可以将其优化为单态函数。但是像你通过 OOP 和继承获得的类似形状的对象呢?
我对以下非常常见的 OOP 案例感兴趣,您有一堆 similar 形状的对象,例如当具有类层次结构时,类(及其对象)共享公共属性。例如:
obj1 = {
foo: 42,
bar: true
}
obj2 = {
baz: "abc",
foo: 666,
qux: null
}
现在当有一些只使用
foo
属性的函数时,我可以将所有这些不同的对象传递给它。从函数的角度来看,它们都具有相同的形状{ foo: number } + *
,但由于附加属性bar
、baz
和qux
,它们的实际形状当然是不同的。
JIT 编译器是否以某种方式涵盖了这种情况?
如果不是,如何重构相似形状的对象以适应“单态”模式?