假设我创建了一个像这样的对象工厂:
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实例的引用?
谢谢!
答案 0 :(得分:2)
obj
和obj2
都会实例化自己的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
对象将在不占用内存中额外空间的情况下使用完全相同的函数。
答案 1 :(得分:1)
他们都有自己的方法实例。
如果您使用prototypes,他们将分享该方法,因为您在原型对象上声明它。
所以你可以做类似
的事情newObj.prototype.add = function(n) {
return this.x+n
}
然后不像以前一样在对象上声明add
。
在V8中有一个名为hidden classes的东西,它基本上意味着只要你不对一个实例进行更改,所有newObj
个实例都将共享一个隐藏类,据我所知,有效地使所有newObj与原型一样分享方法。