Javascript 使用';新';比没有它便宜吗?
鉴于这种非常熟悉的原型结构模型:Javascript 使用';新';比没有它便宜吗?,javascript,class,constructor,prototypal-inheritance,Javascript,Class,Constructor,Prototypal Inheritance,鉴于这种非常熟悉的原型结构模型: function Rectangle(w,h) { this.width = w; this.height = h; } Rectangle.prototype.area = function() { return this.width * this.height; }; 有人能解释为什么调用new Rectangle(2,3)总是比调用Rectangle(2,3)而不使用“new”关键字快10倍吗?我会假设,因为新函数通过引入原型而
function Rectangle(w,h) {
this.width = w;
this.height = h;
}
Rectangle.prototype.area = function() {
return this.width * this.height;
};
有人能解释为什么调用new Rectangle(2,3)
总是比调用Rectangle(2,3)
而不使用“new”关键字快10倍吗?我会假设,因为新函数通过引入原型而增加了函数执行的复杂性,所以它会更慢
例如:
var myTime;
function startTrack() {
myTime = new Date();
}
function stopTrack(str) {
var diff = new Date().getTime() - myTime.getTime();
println(str + ' time in ms: ' + diff);
}
function trackFunction(desc, func, times) {
var i;
if (!times) times = 1;
startTrack();
for (i=0; i<times; i++) {
func();
}
stopTrack('(' + times + ' times) ' + desc);
}
var TIMES = 1000000;
trackFunction('new rect classic', function() {
new Rectangle(2,3);
}, TIMES);
trackFunction('rect classic (without new)', function() {
Rectangle(2,3);
}, TIMES);
当您在没有“new”的情况下调用函数时,您怀疑“this”指向的是什么?它将是“窗口”。更新速度比用“新建”调用新创建的新对象时要慢 将第二个版本更改为:
trackFunction('rect classic (without new)', function() {
Rectangle.call({}, 2,3);
}, TIMES);
看看你能得到什么。另一种尝试是:
trackFunction('rect with constant object', (function() {
var object = { height: 0, width: 0 };
return function() {
Rectangle.call(object, 2, 3);
};
})());
这将节省每次迭代重建虚拟对象的成本。当我执行上述操作时,新对象的执行时间约为148毫秒。没有调用new那么快,但是比触摸文档快得多。对-还要注意,在第二个版本中,调用“call”函数也会带来开销。我怀疑V8对“new”的实现进行了相当好的优化(事实上,从您的数字中可以很清楚地看出)!还要注意的是,矩形(2,3)实际上并没有创建任何东西,它只是(尝试)更新窗口的高度和宽度,矩形也没有,为此调用({},2,3)。因此,不确定这些比较的有效性。它没有创建任何东西,但它对指向引用的“this”指针具有“window”以外的内容。事实上,我会用另一个想法更新答案。哦,请注意,@Angus,它确实创建了一些东西——空对象,这是“call”的第一个参数。
trackFunction('rect with constant object', (function() {
var object = { height: 0, width: 0 };
return function() {
Rectangle.call(object, 2, 3);
};
})());