Мне нравился ответ Near Privman, пока я не столкнулся с проблемой переопределения «супер» метода.Поскольку initialize()
не вызывается до тех пор, пока не будет построен объект Backbone, переопределение может не произойти к тому времени, когда это необходимо (если это необходимо до вызова initialize()
).
InВ частности, это может быть проблемой с parse()
.(Не проблема для Представлений, но определенно для Коллекций и Моделей.) Учитывая эту установку:
MyModel = Backbone.Model.extend({
initialize: function (options) {
this.parse = function (response, xhr) {
// parsing logic
};
// public & private vars/methods here
// and also initialize code
}
});
MySubModel = MyModel.extend({
initialize: function (options) {
this.parse = function (response, xhr) {
// override MyModel with my own parsing logic
}
// public & private vars/methods here
// and initialize code here
}
});
MySubModel.parse()
никогда не будет вызываться.
Вместо этого я обнаружил, что используя IIFE вместо initialize () и решает эту проблему, и читает чище, чем заставляя функцию, которая уже имеет указанное назначение (initialize()
), выполнять двойную функцию в качестве замыкания для определения остальной части класса.
var MyModel = {};
(function () {
this.initialize = function (attributes, options) {
// initialize me
}
this.parse = function (response, xhr) {
// override at will
}
// other public & private vars/methods here
}).call(MyModel);
Backbone.Model.extend(MyModel);
К сожалению, эта проблема связана с тем, что «частные» переменные распределяются между всеми экземплярами класса, как и ответы gilly3 и Near Privman.Хотелось бы услышать неуклюжий способ сделать частные переменные возможными, но, возможно, я должен просто отказаться от этого и признать, что сейчас пишу JavaScript, а не Java / AS3 / C ++.