2012-04-12 20 views
63

Cuál es la diferencia entre inicializar y constructor en un modelo de red troncal.Cuál es la diferencia entre inicializar y constructor en un modelo de red troncal

Cuando amplío un modelo de red troncal (ParentModel) utilizo el método de inicialización para establecer las propiedades predeterminadas. Pero siempre que creo un Modelo basado en ParentModel utilizo el constructor para ejecutar cualquier funcionalidad inicial. Hago esto porque funciona, pero alguien en el trabajo me preguntó por qué uso tanto la inicialización como el constructor y no tenía una buena respuesta aparte de que funciona. Podría pasar tiempo leyendo el código fuente para resolverlo, pero me pareció mucho más fácil preguntar aquí y obtener la respuesta correcta.

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

Tenga en cuenta que, al igual que su 'constructor()' llama al constructor base '()', su anulación de 'initialize()' debería comenzar (al menos en el caso en que esté usando este patrón para extender lo ya sea un modelo extendido) con ' .initialize.apply (this, arguments);', para permitir que cualquier base definida 'initialize() 'se ejecute primero. (Esto me llamó la atención en JointJS, que ya tiene su propio 'initialize()' definido en algunos de sus propios modelos derivados.) – JonBrave

Respuesta

84

constructor se ejecuta antes de que Backbone establezca la estructura. initialize se llama dentro de la función constructor de la estructura. Así que, básicamente, si necesita aumentar algo antes de que Backbone configure la estructura, use constructor si necesita aumentar algo después de que Backbone configure la estructura use initialize.

(de una Github discussion on the subject)

+1

Gracias por la respuesta boyo – screenm0nkey

30

constructor es la función que utiliza Backbone erigirse - la creación de los modelos, el establecimiento de eventos, y haciendo todo tipo de otra configuración. Tenga mucho cuidado al anular esto, porque si evita que el código Backbone se ejecute anulando o sombreando el método, obtendrá errores extraños que son difíciles de depurar.

initialize Por otro lado, es una función que el Backbone llama a sus objetos una vez que ha terminado con su tubería interna. Si no está haciendo algo específicamente diseñado para interferir con la funcionalidad Backbone normal, solo use initialize.

Si está usando CoffeeScript, podría ser más intuitivo usar constructor. (Es para mi). Solo asegúrate de llamar siempre al super.

+1

Una buena nota al llamar a super, eso me ayudó. ¡Gracias! – Andrew

Cuestiones relacionadas