2012-04-12 8 views
63

Qual è la differenza tra inizializzazione e costruttore su un modello backbone.Qual è la differenza tra inizializzazione e costruttore su un modello backbone

Quando estendo un modello backbone (ParentModel), utilizzo il metodo di inizializzazione per impostare le proprietà predefinite. Ma ogni volta che creo un modello basato su ParentModel, utilizzo il costruttore per eseguire qualsiasi funzionalità iniziale. Lo faccio perché funziona, ma qualcuno al lavoro mi ha chiesto perché utilizzo sia l'inizializzazione che il costruttore e non ho avuto una buona risposta a parte il suo funzionamento. Potrei passare il tempo a leggere il codice sorgente per capirlo, ma sembrava molto più facile chiedere qui e ottenere la risposta giusta.

var ParentModel = Backbone.Model.extend({ 
    initialize : function() { 
    // code here 
    }, 
}); 


var Model = ParentModel.extend({ 
    constructor : function (options) { 
    Backbone.Model.prototype.constructor.call(this, options); 
    // code here 
    }, 
+1

Si noti che, proprio come 'constructor()' chiama la base 'constructor()', l'override di 'initialize()' dovrebbe iniziare (almeno nel caso in cui si stia utilizzando questo pattern per estendere ciò che potrebbe è già un modello esteso) con ' .initialize.apply (this, arguments);', per consentire a qualsiasi inizializzazione() 'definita da base di essere eseguita per prima. (Questo mi ha catturato in JointJS, che ha già il suo 'initialize()' definito su alcuni dei suoi modelli derivati.) – JonBrave

risposta

84

constructor viene eseguito prima che Backbone imposti la struttura. initialize viene chiamato all'interno della funzione constructor della struttura. Quindi, in sostanza, se hai bisogno di aumentare qualsiasi cosa prima che Backbone imposti la struttura, usa constructor se hai bisogno di aumentare qualsiasi cosa dopo che Backbone imposta la struttura usa initialize.

(da un Github discussion on the subject)

+1

Grazie per la risposta boyo – screenm0nkey

30

constructor è la funzione che utilizza Backbone di erigersi - la creazione di modelli, l'impostazione di eventi, e fare tutti i tipi di altri setup. State molto attenti a ignorare questo, perché se impedite l'esecuzione del codice Backbone eseguendo l'override o l'ombreggiamento del metodo, otterrete strani errori difficili da debugare.

initialize d'altra parte è una funzione che Backbone chiama sui suoi oggetti una volta terminato con il suo impianto idraulico interno. Se non stai facendo nulla che sia specificamente inteso a interferire con la normale funzionalità Backbone, usa solo l'inizializzazione.

Se si utilizza CoffeeScript, potrebbe essere più intuitivo utilizzare constructor. (È per me). Assicurati di chiamare sempre super, però.

+1

Buona nota per chiamare super, che mi ha aiutato. Grazie! – Andrew

Problemi correlati