7

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

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 实例的引用?

谢谢!

4

2 回答 2

2

两者都objobj2实例化它们自己的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;
}

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

于 2013-07-07T15:53:13.980 回答
1

他们都有自己的该方法的实例。

如果您使用原型,他们将共享该方法,前提是您在原型对象上声明

所以你可以做类似的事情

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

然后不像add以前那样在对象上声明。

在 V8 中有一个叫做隐藏类的东西,这基本上意味着所有newObj实例都将共享一个隐藏类,只要您不对实例进行更改,这将(据我了解)有效地使所有 newObj 共享该方法与原型设计一样。

于 2013-07-07T15:55:00.127 回答