Показать сообщение отдельно
  #1 (permalink)  
Старый 13.01.2014, 02:45
Аспирант
Отправить личное сообщение для Antonius Посмотреть профиль Найти все сообщения от Antonius
 
Регистрация: 30.11.2013
Сообщений: 42

Модификация прототипа «по требованию» — плюсы, минусы, подводные камни
Решаю такую задачу.

Есть относительно большая структура данных, к которой происходит обращение из одного метода объекта. Поскольку обращений при использовании может не быть вовсе, не хочется инициализировать структуру просто так. Хочется инициализировать при первом вызове метода. При этом хочется, чтобы все созданные впоследствие объекты этого типа уже могли использовать эти данные.

Сейчас я это делаю так:
MyObj.prototype.method = function() {
    if (typeof this._data != 'object') {
        this.constructor.prototype._data = {};
        // инициализация данных
    }

    // обращение к данным
};


Но ввиду неопытности и плохого понимания особенностей работы js хочу спросить — не стреляю ли я себе в ногу?

Не хочется привязываться к имени конструктора. Вполне может оказаться, что он еще будет переименован.

Меня смущает ситуация, если пользователь скрипта будет создавать свои объекты, наследуясь от моего. Тут, похоже, этот подход сломается. Если базовый класс уже проинициализировал данные — все хорошо, метод увидит, что они есть в цепочке прототипов, и успокоится. Но если метод будет вызван у класса-потомка, то данные будут инициализированы именно у него, а класс-предок о них ничего не узнает, верно? Можно, конечно, не заморачиваться по этому поводу, но если есть способ сделать надежнее — подскажите, пожалуйста.

А может я вообще неправильно подхожу к проблеме, и есть уже существующие проверенные способы добиться того, что мне нужно. Буду благодарен за разъяснения или ссылки.

Спасибо.
Ответить с цитированием