所以,当我们有一个简单的构造函数时:
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__ 会使情况变得更糟,将所有原型方法克隆到每个对象中甚至更糟。
那么,为什么会发生这种情况呢?有没有办法提高工厂绩效?
更新:使用Object.create
代替Object.setPrototypeOf
, as Bergi建议将工厂调用时间降至 8700 毫秒左右。