【问题标题】:How do unused Javascript object methods impact memory usage?未使用的 Javascript 对象方法如何影响内存使用?
【发布时间】:2012-02-23 21:19:35
【问题描述】:

我正在使用 Javascript 库 (openlayers) 并尝试优化一些类以减少总体内存占用。我注意到,对于某些类,我不需要该类的大部分方法——它们永远不会被调用。

我正要重写其中的一些类,去掉我不需要的方法,但在我这样做之前,我想弄清楚如果我这样做是否会对内存占用产生任何明显影响从精简的类中实例化 10,000 个对象。显然,如果我删除会有所帮助但我不确定方法的属性。

谁能解释一下方法是如何存储的,它们消耗了多少内存,并可能推荐任何我可以掌握这类知识的好书或其他资源?

编辑:感谢您阐明在构造函数中定义方法与原型之间的区别。这似乎是一个混合包,但为了论证起见,我们假设它们是在构造函数中定义的(看起来它们会产生最大的影响)。

【问题讨论】:

  • 方法是在每个实例上声明,还是在prototype 上声明?如果它们在 prototype 上,您不太可能有太大的不同,因为所有实例都有效地共享该方法的一个副本。
  • 它们是在构造函数中定义在对象上,还是通过prototype在实例之间共享?您必须展示一些代码,并且最好通过性能分析器运行您的代码,以查看内存瓶颈的确切位置。
  • @James 和 zzzzBov - 我已经根据你们的 cmets 更新了 OP(谢谢你们)。
  • 为什么方法是直接在构造函数中的实例上定义的?那有什么意义呢?方法应该在原型上定义。
  • @TheOx - 见我的回答。如果有些方法永远不会被调用(并且你确定这一点),那么无论它们是在构造函数中还是在 prototype 上声明,我都没有理由保留它们。

标签: javascript memory javascript-objects


【解决方案1】:

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

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,它在哪里找到并执行。

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

【讨论】:

  • 这正是我一直在寻找的——感谢您简洁明了的回答!
  • 没问题,很高兴能帮上忙 :)
猜你喜欢
  • 2018-06-15
  • 2014-02-09
  • 2013-03-13
  • 1970-01-01
  • 2010-09-06
  • 1970-01-01
  • 2012-01-18
  • 2016-06-27
  • 1970-01-01
相关资源
最近更新 更多