2012-01-23 14 views
67

Devo chiamare il metodo initialize della classe genitore, dall'interno della classe ereditata MyModel, invece di sovrascriverlo completamente come faccio oggi.Accesso alla classe genitore in Backbone

Come posso fare questo?

Ecco ciò che il mio codice è in questo momento:

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. 
    }, 
}); 

risposta

50
MyModel = BaseModel.extend({ 
    initialize: function() { 
     MyModel.__super__.initialize.apply(this, arguments); 
     // Continue doing specific stuff for this child-class. 
    }, 
}); 
+0

Ciao Raynos - Questo genera un errore di "troppa ricorsione" nella console .. – Industrial

+1

@Industrial quindi sta facendo qualcosa di stupido. Prova 'this .__ super __. Initialize.apply (this, arguments);' – Raynos

+5

'__ super __' non è inteso per usarlo direttamente, come implica il nome sottolineato. –

5

Penso che sarebbe

MyModel = BaseModel.extend({ 
    initialize: function() { 
     this.constructor.__super__.initialize.call(this); 
     // Continue doing specific stuff for this child-class. 
    }, 
}); 
+0

E ' 'questo .__ super-__ initialize.call (this);..' ' – Raynos

+0

Sia questo .__ super-__ prototype.initialize.call (this);' e 'questo .__ super-__ initialize.call (questo).; 'getta' questo .__ super__ è undefined' in Firebug. – Industrial

+0

nessuno di loro funziona :( –

-4

si potrebbe considerare riscrivere il codice utilizzando l'ereditarietà funzionale.

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 
    }; 
}; 
+0

dubito che la backbone sia in ordine qui :) dobbiamo gestirli con la struttura backbone ci dà, e ci sono soluzioni molto migliori rispetto a riscrivere tutto questo, come il __super__ è più che sufficiente. – Sander

125

Prova

MyModel = BaseModel.extend({ 
    initialize: function() { 
     BaseModel.prototype.initialize.apply(this, arguments); 
     // Continue doing specific stuff for this child-class. 
    }, 
}); 
+0

sembra funzionare anche in presenza di chiamate '_.bindAll (this)', che rendono indefinita la proprietà '__super__' del costruttore. – sweaver2112

+1

meglio di usare '__super__' ha il trattino di sottolineatura suggerisce un membro privato –

4

questo sembra essere quasi un duplicato di Super in Backbone, così si vuole qualcosa di simile:

Backbone.Model.prototype.initialize.call(this); 
2

Simile a @wheresrhys, ma vorrei usare applicare al posto di chiamata in caso BaseModel.initialize si aspetta argomenti. Cerco di evitare di elaborare la mappa degli attributi che può essere passata a un modello backbone al momento dell'inizializzazione, ma se il BaseModel fosse effettivamente una vista o una raccolta, potrei voler impostare le opzioni.

var MyModel = BaseModel.extend({ 
    initialize: function() { 
     this.constructor.__super__.initialize.apply(this, arguments); 
     // Continue doing specific stuff for this child-class. 
    }, 
}); 
+0

FWIW Jeremy Ashkenas [** stati **] (https://github.com/jashkenas/backbone/pull/787#issuecomment-3143358) che' __super__' non è destinato ad essere usato direttamente – MikeSchinkel

0

ecco un metodo callSuper di più generazioni, basta aggiungerlo alla classe estesa.

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; 
} 
Problemi correlati