Ich muss die initialize
Methode der übergeordneten Klasse innerhalb der geerbten Klasse MyModel
aufrufen, anstatt sie wie heute vollständig zu überschreiben.
Wie könnte ich das machen?
So sieht mein Code gerade aus:
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.
},
});
javascript
oop
class
inheritance
backbone.js
Industriell
quelle
quelle
this.__super__.initialize.apply(this, arguments);
__ super __
ist nicht dazu gedacht, es direkt zu verwenden, wie der unterstrichene Name impliziert.BaseModel.prototype.initialize.apply(this, arguments);
? das sollte ohne funktionieren__super__
.__super__
nicht für die direkte Verwendung vorgesehen ist.Versuchen
MyModel = BaseModel.extend({ initialize: function() { BaseModel.prototype.initialize.apply(this, arguments); // Continue doing specific stuff for this child-class. }, });
quelle
_.bindAll(this)
Aufrufen zu funktionieren , die die__super__
Eigenschaft des Konstruktors undefiniert machen.__super__
hat der Unterstrich ein privates Mitglied vorgeschlagenDies funktionierte für mich, als ich versuchte, unter meinen Modellen zu erben:
MyModel.prototype.initialize.call(this, options);
Referenziert von http://documentcloud.github.com/backbone/#Model-extend
Vielen Dank.
quelle
Ich denke es wäre
MyModel = BaseModel.extend({ initialize: function() { this.constructor.__super__.initialize.call(this); // Continue doing specific stuff for this child-class. }, });
quelle
this.__super__.initialize.call(this);
this.__super__.prototype.initialize.call(this);
undthis.__super__.initialize.call(this);
wirftthis.__super__ is undefined
Firebug ein.__super__
nicht für die direkte Verwendung vorgesehen ist.Dies scheint fast ein Duplikat von Super in Backbone zu sein , also möchten Sie so etwas:
Backbone.Model.prototype.initialize.call(this);
quelle
Ähnlich wie @wheresrhys, aber ich würde apply anstelle von call verwenden, falls BaseModel.initialize Argumente erwartet. Ich versuche zu vermeiden, die Attributzuordnung zu verarbeiten, die bei der Initialisierung an ein Backbone-Modell übergeben werden kann. Wenn das BaseModel jedoch tatsächlich eine Ansicht oder eine Sammlung wäre, möchte ich möglicherweise Optionen festlegen.
var MyModel = BaseModel.extend({ initialize: function() { this.constructor.__super__.initialize.apply(this, arguments); // Continue doing specific stuff for this child-class. }, });
quelle
__super__
nicht für die direkte Verwendung vorgesehen ist.Hier ist eine CallSuper-Methode für mehrere Generationen. Fügen Sie sie einfach Ihrer erweiterten Klasse hinzu.
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; }
quelle
Sie können Ihren Code mithilfe der funktionalen Vererbung neu schreiben.
var BackBone=function(){ var that={}; that.m1=function(){ }; return that; }; var MyModel=function(){ var that=BackBone(); var original_m1=that.m1; //overriding of m1 that.m1=function(){ //call original m1 original_m1(); //custom code for m1 }; };
quelle