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

Are private function declarations within a constructor reinstantiated everytime an instance is created?

本文关键字:实例 创建 实例化 函数 是否 声明 构造函数      更新时间:2023-09-26
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足够聪明,不会像这样重新实例化私有函数,但我不确定。

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

是的,每次都会创建一个新的函数对象。如果引擎足够智能,底层代码可以在它们之间共享。V8(在Chrome中(是,我敢肯定,大多数(如果不是全部(顶级引擎在2016年都在这里。

就此而言,给定private函数的示例、它的作用及其范围,我希望一个像样的引擎能够完全优化该功能。

private功能是否对性能造成不必要的影响?

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

在这种特殊情况下,您显示private没有使用仅在构造函数内部可用的任何信息,因此没有特别的理由在构造函数中创建它。把它移出去是有道理的。如果您愿意,您仍然可以将其保密,而无需每次都重新创建它:

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引用的对象支持的对象,然后调用SomeFunctionthis引用该对象。如果SomeFunction不返回任何内容,或返回原语(如42(,或返回null,则new表达式的结果是对new创建的对象的引用。如果SomeFunction返回非null对象引用,则改为new表达式的结果。