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足够聪明,不能重新实现这样的私有函数,但我不确定。
答案 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
表达式的结果。