匿名功能存储的效率

glo*_*loo 7 javascript performance anonymous-function

假设我创建了一个像这样的对象工厂:

var newObj=function(x){
  var obj=[]
  obj.x=x
  obj.add=function(n){
    return this.x+n
  }
  return obj
}
Run Code Online (Sandbox Code Playgroud)

现在假设我创建了这个对象的数百个实例:

var obj1=newObj(1)
var obj2=newObj(2)
...
Run Code Online (Sandbox Code Playgroud)

每个obj1,obj2,...是否存储了自己的obj.add副本,还是它们都包含对存储在内存中的单个obj.add实例的引用?

谢谢!

Way*_*hen 2

obj都会obj2实例化它们自己的obj.add. 它们是在创建时执行并在对象生命周期内存储在内存中的函数表达式。

如果你想保持性能,你应该使用原型设计

var newObj=function(x){
  this.obj = [];
  this.obj.x = x;
  return this.obj;
}

newObj.prototype.add = function(n) {
    return this.obj.x += n;
}
Run Code Online (Sandbox Code Playgroud)

这将创建一个所有未来对象都将使用的函数,newObj而不会为完全相同的函数占用额外的内存空间。

  • 如果像以前一样在原型和函数中声明方法_both_,那么使用原型的意义就会消失,因为后者将覆盖原型定义 (2认同)