2012-06-29 3 views
1

Si je ce modèle:épine dorsale Hériter les attributs du modèle parent

var myParentModel = Backbone.Model.extend({ 
    defaults:{ parent1: null, 
       parent2: null} 
)}; 

et j'ai un autre modèle:

var myModel = myParentModel.extend({ 
    defaults: {child1: null, 
       child2: null} 
)}; 

si j'instancier une nouvelle myModel:

var mymodel = new myModel({child1: 'mychild1'}); 

En la propriété attributes je n'ai que la valeur par défaut de la propriété child2, comment l'implémentation hérite-t-elle de la propriété parents du parent? t le modèle?

Répondre

3

En github il y a un interesting post cette question, la solution que j'étais mise en œuvre est la suivante:

myModel.prototype.defaults = 
    _.extend({ 
     child1: null, 
       child2: null 
    }, myParentModel.prototype.defaults, 
     myModel.prototype.defaults); 

Avec la fonction underscore: étendre, nous avons un nouveau défaut d'objet avec le parent et le prototype de l'enfant, c'est une bonne solution pour plusieurs héritera

2

je cela, à ce stade, il n'y a pas besoin d'utiliser le prototype si vous êtes dans la même portée:

var abstractDefaults = { 
    parent1 : '', 
    parent2 : '' 
}; 
var MyParentModel = Backbone.Model.extend({ 
    defaults: abstractDefaults 
}); 
var MyModel = Backbone.Model.extend({ 
    defaults: _.extend(abstractDefaults, { 
    child1 : '', 
    child2 : '' 
    }) 
}); 
console.log(new MyModel().toJSON()); 
+0

Si vous avez plus d'un modèle enfant, le dernier enfant héritera des propriétés de l'enfant précédent, ce qui n'est pas souhaitable. – codingpuss

2

Je recommande vraiment d'utiliser une fonction pour étendre les attributs par défaut comme ceci:

var MyParentModel = Backbone.Model.extend({ 
    defaults: { 
     parent1 : '', 
     parent2 : '' 
    } 
}); 
var MyModel = MyParentModel.extend({ 
    defaults: function() { 
     return _.extend(
      { 
       child1 : '', 
       child2 : '' 
      }, 
      MyParentModel.prototype.defaults 
     ); 
    } 
}); 

La raison est que vous éviterez des problèmes avec une référence partagée aux nouveaux attributs par défaut entre vos différentes instances de l'objet MyModel Pour plus de clarté, si vos attributs par défaut contiennent array et si vous instanciez plusieurs fois votre MyModel, les attributs qui contiennent le tableau seront partagés entre chaque instance. L'utilisation d'une fonction pour déclarer vos attributs par défaut l'évitera.

J'espère que je suis assez clair.

Questions connexes