2012-02-23 95 views
2

我正在使用Javascript库(openlayers),并试图优化一些类以减少整体内存占用。我注意到,对于某些类,我不需要该类的大部分方法 - 它们将永远不会被调用。未使用的Javascript对象方法如何影响内存使用?

我正要重写其中的一些类,剥离出我不需要的方法,但在此之前我想弄清楚这对于内存占用会不会有任何明显的影响,如果我是从精简的类中实例化10,000个对象。很明显,如果我删除将帮助但我不确定方法的属性。

任何人都可以解释如何存储方法,他们消耗多少内存,并可能推荐任何好书或其他资源,我可以在这种类型的知识骨骼?

编辑:谢谢澄清定义在构造函数与原型的方法之间的区别。它似乎是一个混杂的包,但为了争论让我们假设它们是在构造函数中定义的(它出现的位置对它们影响最大)。

+3

方法是在每个实例上还是在'prototype'上声明的?如果他们在“原型”上,则不太可能产生很大的差异,因为所有实例都有效地共享该方法的一个副本。 – 2012-02-23 21:22:04

+0

它们在构造函数中定义在对象上,还是通过'prototype'在实例之间共享?您必须展示一些代码,并理想地通过性能分析器运行您的代码以准确查看内存瓶颈的创建位置。 – zzzzBov 2012-02-23 21:23:15

+0

@James和zzzzBov - 我已根据您的意见更新了OP(感谢您的评论)。 – TheOx 2012-02-23 21:38:23

回答

4

我认为这取决于是否在内存中为对象的每个实例创建了方法的副本。例如:

var MyObj = function(x) { 
    this.doStuff = function() { 
     //Do some stuff 
    }; 
    this.someProperty = x; 
}; 
//myInstance will have its own copy of the doStuff method 
var myInstance = new MyObj(10); 

在上面的代码中,MyObj每个实例将需要doStuff在存储器中的副本。然而,如果在prototype声明的方法,这是一个不同的故事:

var MyObj = function(x) { 
    this.someProperty = x; 
}; 
MyObj.prototype.doStuff = function() { 
    //Do some stuff 
}; 
//myInstance can still access doStuff, but all instances share one copy 
var myInstance = new MyObj(10); 

这一次,MyObj每个实例都有自己的属性someProperty,但是当你调用doStuff方法,它不是在实例中发现本身,所以prototype被看作是在它被发现和执行的地方。

但是,如果像您所说的那样,有些方法根本没有被调用,我不认为有任何理由让它们在任何地方被声明。就我个人而言,我会摆脱它们(除非它们有可能在未来提供价值)。但是我不知道你的代码,所以这是你必须做出的决定。

+0

这就是我一直在寻找的东西 - 感谢您提供简洁明了的答案! – TheOx 2012-02-23 21:43:12

+0

没问题,很高兴我可以帮助:) – 2012-02-23 21:44:00

相关问题