Inheritance in JavaScript è prototipo - oggetti possono rivolgersi direttamente alle proprietà più in alto nella prototype chain.
Nel tuo esempio, one
e two
entrambi condividono un prototipo comune, e non forniscono i propri valori per myProperty
in modo che entrambe si riferiscono direttamente a Model.protoype.myProperty
.
È necessario creare un nuovo array myProperty
per ciascun modello creato per l'istanza. Model.initialize
è la posizione idiomatica per questo tipo di inizializzazione: la sostituzione di constructor
è inutilmente complessa.
var Model = Backbone.Model.extend({
initialize: function() {
this.myProperty = [];
}
});
In alternativa si potrebbe fare myProperty
come un attributo del modello:
var Model = Backbone.Model.extend({
defaults: function() {
return {
myProperty: []
}
}
});
E 'importante notare che defaults
è una funzione - se si sceglie di usare un semplice oggetto che si verifica lo stesso problema di riferimento condiviso.
Grazie! Ho pensato di inizializzare myProperty in initialize (mi dispiace per tautologia: D), ma mi è sembrato strano che inizializzarlo in un altro modo porta a risultati diversi. Almeno è semanticamente non ovvio ... Ma è un problema javascipt, non Backbone, immagino. – alexb
Esattamente - il punto chiave è che è un JavaScript, non una cosa Backbone. Non è intrinsecamente un problema, infatti è completamente necessario per un sistema prototipo - senza di esso le istanze del modello non possono condividere metodi o proprietà comuni senza creare molti oggetti duplicati. Tuttavia, causa questo tipo di errore molto spesso! – joews