Как неиспользуемые методы объекта Javascript влияют на использование памяти? - PullRequest
2 голосов
/ 24 февраля 2012

Я работаю с библиотекой Javascript (openlayers) и пытаюсь оптимизировать некоторые классы, чтобы уменьшить общий объем памяти.Я заметил, что для некоторых классов мне не нужна большая часть методов этого класса - они никогда не будут вызваны.

Я собирался переписать некоторые из этих классов, отбросив ненужные мне методы, но прежде чем я сделаю это, я хотел бы выяснить, окажет ли это какое-либо заметное влияние на объем памятиесли бы я должен был создать экземпляр, скажем, 10 000 объектов из урезанного класса.Очевидно, что если я удалю свойства, которые помогут, но я не уверен насчет методов.

Может ли кто-нибудь дать объяснение того, как хранятся методы, сколько памяти они используют, и, возможно, порекомендовать любые хорошие книги или другие ресурсы, гдеЯ могу подтвердить эти знания?

РЕДАКТИРОВАТЬ: Спасибо за разъяснение разницы между определением метода в функции конструктора и прототипа.Похоже, что это смешанный пакет, но ради аргумента давайте предположим, что они определены в функции конструктора (где, по-видимому, они окажут наибольшее влияние).

1 Ответ

4 голосов
/ 24 февраля 2012

Я думаю, что это действительно зависит от того, создается ли копия ваших методов в памяти для каждого экземпляра объекта. Например:

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, где он найден и выполнен.

Однако, если, как вы говорите, существуют методы, которые вообще не вызываются, я не вижу никакой причины хранить их независимо от того, где они объявлены. Лично я бы от них избавился (если только они не будут обеспечивать ценность в будущем). Но я не знаю ваш код, так что вам придется принять это решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...