未使用的Javascript对象方法如何影响内存使用?

未使用的Javascript对象方法如何影响内存使用?,javascript,memory,javascript-objects,Javascript,Memory,Javascript Objects,我正在使用一个Javascript库(openlayers),并试图优化一些类以减少总体内存占用。我注意到,对于某些类,我不需要该类的大部分方法——它们永远不会被调用 我正要重写其中的一些类,剥离出我不需要的方法,但在此之前,我想弄清楚,如果我要实例化剥离类中的10000个对象,这是否会对内存占用产生明显的影响。显然,如果我删除属性,这将有所帮助,但我不确定方法 有没有人能解释一下方法是如何存储的,它们消耗了多少内存,并推荐一些好书或其他资源,让我可以深入了解这类知识 编辑:感谢您澄清了在构造函

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

我正要重写其中的一些类,剥离出我不需要的方法,但在此之前,我想弄清楚,如果我要实例化剥离类中的10000个对象,这是否会对内存占用产生明显的影响。显然,如果我删除属性,这将有所帮助,但我不确定方法

有没有人能解释一下方法是如何存储的,它们消耗了多少内存,并推荐一些好书或其他资源,让我可以深入了解这类知识


编辑:感谢您澄清了在构造函数中定义方法与在原型中定义方法之间的区别。这似乎是一个混合包,但为了便于讨论,让我们假设它们是在构造函数中定义的(在这里它们似乎会产生最大的影响)。

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

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
副本。但是,如果该方法是在
原型上声明的,则情况就不同了:

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
方法时,在实例本身上找不到它,因此将查看
原型,在那里找到并执行它


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

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

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
副本。但是,如果该方法是在
原型上声明的,则情况就不同了:

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
上,则不太可能有太大区别,因为所有实例实际上都共享一个方法副本。它们是在构造函数中的对象上定义的,还是通过
prototype
在实例之间共享的?您必须显示一些代码,最好通过性能分析器运行您的代码,以查看内存瓶颈的确切位置。@James和ZZBOV-我已经根据您的注释更新了OP(感谢您的注释)。为什么这些方法直接在构造函数中的实例上定义?这有什么意义?方法应该在原型上定义。@TheOx-参见我的答案。如果有一些方法从未被调用过(你可以肯定),那么无论它们是在构造函数中声明的还是在
原型中声明的,我都看不到保留它们的任何理由。这些方法是在每个实例上声明的,还是在
原型上声明的?如果它们在
prototype
上,则不太可能有太大区别,因为所有实例实际上都共享一个方法副本。它们是在构造函数中的对象上定义的,还是通过
prototype
在实例之间共享的?您必须显示一些代码,最好通过性能分析器运行您的代码,以查看内存瓶颈的确切位置。@James和ZZBOV-我已经根据您的注释更新了OP(感谢您的注释)。为什么这些方法直接在构造函数中的实例上定义?这有什么意义?方法应该在原型上定义。@TheOx-参见我的答案。如果有一些方法从未被调用过(你可以肯定),那么无论它们是在构造函数中声明的还是在
原型中声明的,我都看不到任何保留它们的理由。这正是我想要的-谢谢你给出了清晰简洁的答案!没问题,很高兴我能帮上忙:)这正是我要找的-谢谢你简洁明了的回答!没问题,很高兴我能帮忙:)