所以,当我们有一个简单的构造函数时:
function Vec(x, y) {
this.x = x;
this.y = y;
}
和工厂类似:
function VecFactory(x, y) {
return {
x: x,
y: y
}
}
表现具有可比性:
100000000 constructors: 1874 ms
100000000 factory calls: 1782 ms
但是当我们添加原型时:
function VecFactory(x, y) {
let result = {
x: x,
y: y
}
Object.setPrototypeOf(result, Vec.prototype);
return result;
}
表现急剧下降
100000000 factory calls: 13251 ms
分配给__proto__会使情况变得更糟,将所有原型方法克隆到每个对象中甚至更糟。
那么,为什么会这样呢?有没有办法提高工厂绩效?
UPD:使用Object.create
代替Object.setPrototypeOf
,如 Bergi 所示,将工厂通话时间降至8700毫秒左右。