我的问题是对此问题的跟进:Clearing up the `hidden classes` concept of V8
假设我有以下JavaScript代码:
var values1 = [ 1, 2, 3, 4];
var values2 = [ 5, 6, 7, 8];
var fields = [ "f1", "f2", "f3", "f4" ];
function Construct (fields, values) {
var i;
for (i = fields.length - 1; i >= 0; --i) this [fields [i]] = values [i];
}
var a = new Construct (fields, values1);
var b = new Construct (fields, values2);
那么,a
和b
最终会拥有相同的隐藏类吗?
这个问题的背景是,对我来说,如果在编程时不知道属性名称,这似乎是利用“隐藏类”优化的唯一可能性。
实用相关性:假设您编写了一个处理表格数据的应用程序,其中列的名称是动态的(在编程时不知道)。然后表的行在语义上共享同一个类,但如果引擎没有优化,你最好使用数组并在代码中手动执行“列名 - >索引”转换(这可能会使代码变得丑陋,因为你必须缓存索引)。
答案 0 :(得分:2)
是。隐藏类是完全动态的优化。在第一个近似中,如果(1)它们是由同一段代码创建的,则两个对象将以相同的类结束,并且(2)它们以相同的顺序添加相同的属性。