每次创建实例时,构造函数中的私有函数声明是否会重新实例化?

时间:2016-02-10 14:42:06

标签: javascript

function Meal(n) {
    function private(cal) {
        return cal * 2;
    }
    this.calories = private(n);
}

//private is being reinstantiated three times?
var breakfast = new Meal(3);
var lunch = new Meal(56);
var dinner = new Meal(100);

private功能是否会造成不必要的性能损失?它会是否相同:

function public(cal) {
    return cal * 2;
}

function Meal(n) {
    this.calories = public(n);
}

MDN写道:

  

构造函数返回的对象成为整个新表达式的结果。

我在理解“全新表达的结果”时遇到了一些麻烦。这是不是意味着,因为私有函数声明在构造函数定义中,它们是“全新表达式的结果”?似乎javascript足够聪明,不能重新实现这样的私有函数,但我不确定。

1 个答案:

答案 0 :(得分:4)

  

每次创建实例时,构造函数中的私有函数声明是否都会重新实现?

是的,每次都会创建一个新函数 object 。如果引擎足够智能,则可以在它们之间共享底层代码。 V8(在Chrome中)是,并且我确定大多数(如果不是所有的顶级引擎)都在2016年。

就此而言,鉴于示例private函数,它的作用及其范围,我希望一个不错的引擎能够完全优化函数。

  

private功能是否会造成不必要的性能损失?

这是你的电话。在任何现代JavaScript引擎上创建函数非常,非常快

特定情况中,您显示的private并未使用构造函数中仅提供的任何信息,因此&#39 ;没有特别的理由在构造函数中创建它。移出它是有道理的。如果您愿意,您仍然可以将其保密,而无需每次都重新创建:

var Meal = (function() {
    function private(cal) {
        return cal * 2;
    }

    return function Meal(n) {
        this.calories = private(n);
    };
})();

现在,private仅创建一次,并且所有Meal实例都使用该单个函数。 (Meal也只创建一次。)

  

构造函数返回的对象成为整个新表达式的结果。

这与你的主要问题大多无关。执行new SomeFunction时,JavaScript引擎会创建一个由SomeFunction.prototype引用的对象支持的对象,然后使用引用该对象的SomeFunction调用this。如果SomeFunction没有返回任何内容,或返回42之类的原语,或返回null,则new表达式的结果是对该对象的引用new已创建。如果SomeFunction返回非null对象引用,则 new表达式的结果。