Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/469.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用';新';比没有它便宜吗?_Javascript_Class_Constructor_Prototypal Inheritance - Fatal编程技术网

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);
  };
})());