Je dois appeler la méthode initialize
de la classe parente, depuis l'intérieur de la classe MyModel
- héritée, au lieu de l'écraser complètement comme je le fais aujourd'hui.
Comment pourrais-je faire ça?
Voici à quoi ressemble mon code:
BaseModel = Backbone.Model.extend({
initialize: function(attributes, options) {
// Do parent stuff stuff
}
});
MyModel = BaseModel.extend({
initialize: function() {
// Invoke BaseModel.initialize();
// Continue doing specific stuff for this child-class.
},
});
MyModel = BaseModel.extend({
initialize: function() {
MyModel.__super__.initialize.apply(this, arguments);
// Continue doing specific stuff for this child-class.
},
});
Essayer
MyModel = BaseModel.extend({
initialize: function() {
BaseModel.prototype.initialize.apply(this, arguments);
// Continue doing specific stuff for this child-class.
},
});
Cela a fonctionné pour moi, alors que j'essayais d'hériter parmi mes modèles:
MyModel.prototype.initialize.call(this, options);
Référencé depuis http://documentcloud.github.com/backbone/#Model-extend
Merci.
Je pense que ce serait
MyModel = BaseModel.extend({
initialize: function() {
this.constructor.__super__.initialize.call(this);
// Continue doing specific stuff for this child-class.
},
});
cela semble être presque une copie de Super dans Backbone , donc vous voulez quelque chose comme ça:
Backbone.Model.prototype.initialize.call(this);
Semblable à @wheresrhys, mais j'utiliserais apply au lieu de call au cas où BaseModel.initialize attend des arguments. J'essaie d'éviter de traiter la mappe d'attributs pouvant être transmise à un modèle de colonne de base lors de l'initialisation, mais si le modèle de base était en fait une vue ou une collection, je pourrais peut-être définir des options.
var MyModel = BaseModel.extend({
initialize: function() {
this.constructor.__super__.initialize.apply(this, arguments);
// Continue doing specific stuff for this child-class.
},
});
voici une méthode callSuper multi génération, ajoutez-la simplement à votre classe d'extension.
callSuper: function (methodName) {
var previousSuperPrototype, fn, ret;
if (this.currentSuperPrototype) {
previousSuperPrototype = this.currentSuperPrototype;
// Up we go
this.currentSuperPrototype = this.currentSuperPrototype.constructor.__super__;
} else {
// First level, just to to the parent
this.currentSuperPrototype = this.constructor.__super__;
previousSuperPrototype = null;
}
fn = this.currentSuperPrototype[methodName];
ret = (arguments.length > 1) ? fn.apply(this, Array.prototype.slice.call(arguments, 1)) : fn.call(this);
this.currentSuperPrototype = previousSuperPrototype;
return ret;
}