匿名功能存储的效率
假设我创建了一个对象工厂,如下所示:
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实例的引用?
谢谢!
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;
}
这将创建一个函数,所有未来的newObj
对象将使用这些函数,而不占用内存中的额外空间以实现完全相同的功能。
他们都会有自己的那种方法。
如果您使用原型,只要您在原型对象上声明原型,就会共享该方法。
所以你可以做类似的事情
newObj.prototype.add = function(n) {
return this.x+n
}
然后不像以前那样声明add
对象。
在V8中有一个叫隐藏类的东西,它基本上意味着只要你不更改实例,所有newObj
实例就会共享一个隐藏类,这将会(据我所知)有效地使所有newObj共享方法和原型一样。
上一篇: efficiency of anonymous function storage
下一篇: jQuery get specific option tag text and placing dynamic variable to the value