构造函数中的私有函数声明是否在每次创建实例时重新实例化
Are private function declarations within a constructor reinstantiated everytime an instance is created?
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
引用的对象支持的对象,然后调用SomeFunction
,this
引用该对象。如果SomeFunction
不返回任何内容,或返回原语(如42
(,或返回null
,则new
表达式的结果是对new
创建的对象的引用。如果SomeFunction
返回非null
对象引用,则改为new
表达式的结果。
- 实例创建(JS)
- 如何基于数组值创建新实例
- 代码挑战:创建一个跟踪对象实例总数的类Foo
- JavaScript:如果现有对象被实例化为具有特定值,如何创建警报
- 用javascript创建另一个对象的实例
- 单击按钮创建多实例jQuery UI对话框
- 如何确定 HTML 元素是使用哪个实例创建的
- 创建一个类,该类使用es6类语法将Function对象创建为实例
- 调用函数和创建函数实例之间的Javascript差异
- setTimeout是否创建函数实例
- 基于分隔符/方括号的实例创建数组
- Ember.js:如何使用模型的单个实例创建路由/控制器
- 从继承的实例创建 JavaScript 基类对象
- 对象的等效实例.创建和原型链
- 这是正常的行为,为每一个Firefox窗口,我的插件的另一个实例创建
- Aurelia自定义元素实例创建
- 为多个实例创建一个jquery代码
- 是否更改构造函数's属性的实例创建后会影响实例吗?如果是,那么如何
- 实例创建
- 烬数据没有为新实例创建id