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

var newObj=function(x){
  var obj=[]
  obj.x=x
  obj.add=function(n){
    return this.x+n
  }
  return obj
}

现在假设我创建了该对象的数百个实例:
var obj1=newObj(1)
var obj2=newObj(2)
...

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

谢谢!

最佳答案

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

如果要保持性能,则应该使用prototyping:

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

newObj.prototype.add = function(n) {
    return this.obj.x += n;
}

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

09-20 03:57