web-dev-qa-db-fra.com

nouveau Backbone.Model () vs Backbone.Model.extend ()

Je suis nouveau sur JS et Backbone

Quelle est la différence entre ces deux?

TestModel = new Backbone.Model({ title: "test title" })
TestModel = Backbone.Model.extend({ title: "test title" })
60
crapthings

Il existe une différence fondamentale, qui peut être décrite en bref comme "la différence entre le projet d'une maison et la maison elle-même".

Pour les programmeurs experts, je dirais simplement que "new Backbone.Model" renvoie une instance d'objet, mais "Backbone.Model.extend" renvoie une fonction constructeur

PREMIER: un nouvel objet (c'est-à-dire la maison)

var TestModel = new Backbone.Model({ title: "test title" });

vous créez un nouvel objet dont la structure (méthodes et variables) a été définie ailleurs. L'objet peut être considéré comme "tous les éléments non natifs" d'une langue, où pour "élément natif", je veux dire les types de base comme les entiers, les caractères, etc.

Dans les accolades {}, vous passez la valeur d'une variable ou d'une méthode. Ceci est appelé, comme Tomasz Nurkiewicz l'a expliqué précédemment, un constructeur, car il vous permet de "construire" un nouvel objet dont le modèle a été décrit ailleurs.

Pour vous donner un exemple connu: vous écrivez

var myArray = new Array();

Cela signifie que vous créez un nouveau tableau, qui est un objet non natif qui a été défini ailleurs. vous pouvez également écrire:

var myArray = new Array([1,2,3,4,5]);

Et il remplit le tableau avec les nombres donnés.

DEUXIÈME: modifier la définition d'un objet existant (c'est-à-dire le projet de la maison)

avec

var TestModel = Backbone.Model.extend({ title: "test title" })

vous dites quelque chose de très simple à votre VM: "l'objet que vous me donnez par défaut est très sympa, mais je veux implémenter plus de fonctions/propriétés". Ainsi, avec la clause "extend", vous modifiez la définition d'un objet en ajoutant ou en remplaçant les méthodes/propriétés existantes.

Exemple: un bel exemple dans backbone.js est donné par la fonction comparateur d'une collection. Lorsque vous étendez l'objet le définissant, "il sera utilisé pour maintenir la collection dans l'ordre trié".

Exemple:

myCollection = Backbone.Collection.extend({
    comparator:function(){
        return item.get('name');
    }
});

EN GÉNÉRAL

Ce que vous êtes censé faire lorsque le `` backboning '' (développement à l'aide du framework backbone.js) consiste à étendre l'objet donné (par exemple une vue) avec:

window.ButtonView = Backbone.View.extend({
    btnText:'nothingByDefault',
    myNewMethod:function(){
       //do whatever you want, maybe do something triggered by an event, for instance
    }
});

puis utilisez-le ailleurs dans le code, une fois pour chaque bouton que vous souhaitez gérer, y compris dans les accolades toutes les valeurs que vous souhaitez donner à l'objet

[...]
var submitBtn = new ButtonView({btnText:"SubmitMe!"}),
var cancelBtn = new ButtonView({btnText:"Erase All!"});

....J'espère que cela t'aides...

77
Daniele B

Dans le second cas, TestModel est un constructeur que vous pouvez utiliser plusieurs fois plus tard pour créer une instance de modèle:

var model = new TestModel();

Cependant, passer title à extend a une signification différente. Vous devriez probablement utiliser:

var TestModel = Backbone.Model.extend({defaults: { title: "test title" }});

ou passez les attributs du modèle lors de la création d'un objet:

var model = new TestModel({ title: "test title" });

Dans le premier cas, en revanche, TestModel est déjà une instance de modèle (il doit donc être nommé testModel pour suivre la convention de dénomination JavaScript):

var testModel = new Backbone.Model({ title: "test title" })
14
Tomasz Nurkiewicz