我倾向于使用工厂方法在javascript中构造没有this
关键字的对象。例如:
var PointA = function(x, y) {
var z = {};
z.x = x;
z.y = y;
return z;
};
var z0 = PointA(1, 2);
我看到了几个示例,演示了v8如何使用隐藏类实现快速属性查找,但所有这些示例都使用了对象构造的标准技术,即:
var PointB = function(x, y) {
this.x = x;
this.y = y;
};
var z0 = new PointB(1, 2);
如果我使用像PointA
这样的非传统工厂,那么我是否妨碍了v8的隐藏类优化器?
发布于 2014-06-16 12:17:27
JavaScript中的所有V8对象都使用隐藏类机制,所以不管是通过构造函数创建对象还是从文字创建对象--两者都有隐藏类。
然而,重要的是隐藏类是如何相互连接的。隐藏类正在形成转换树,根连接到构造函数上。如果要从文字中创建对象,这意味着您的转换树本质上是从Object
构造函数中增长的。这有时会混淆V8,因为逻辑上断开连接的转换树似乎在根上连接到V8。看看这 jsPerf微基准测试。我创建了两个看似断开连接的对象:
function X() {
var self = {};
self.x = 0.1;
return self;
}
function Y() {
var self = {};
self.x = true;
return self;
}
var y = new Y, x = new X;
然而,在内部,V8无法为X
生成的对象上的属性x
选择最有效的表示形式,因为它也将Y
生成的对象视为同一隐藏类转换树的一部分。如果通过构造函数创建对象,该构造函数启动新的转换树并得到结果,则不存在类型混淆。
https://stackoverflow.com/questions/24233820
复制相似问题