2012-02-01 7 views

risposta

74

C'è una differenza fondamentale, che a breve può essere descritto come "la differenza tra il progetto di una casa e la casa stessa ".

Per i programmatori esperti vorrei solo dire che "nuova Backbone.Model" restituisce un'istanza di oggetto, ma "Backbone.Model.extend" restituisce una funzione di costruzione

PRIMO: un nuovo oggetto (vale a dire La casa)

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

si crea un nuovo oggetto la cui struttura (metodi e variabili) sono stati definiti da qualche altra parte. L'oggetto può essere considerato come "tutti gli elementi non nativi" di una lingua, dove per "elemento nativo" intendo tipi di base come numeri interi, caratteri ecc.

Nelle parentesi graffe {} si passa il valore di qualche variabile o metodo. Questo è chiamato, come ha spiegato in precedenza Tomasz Nurkiewicz, un costruttore, perché consente di "costruire" un nuovo oggetto il cui modello è stato descritto altrove.

Per darvi un esempio noto: si scrive

var myArray = new Array(); 

Significa che si sta creando una nuova matrice, che è un oggetto non nativo, che è stata definita altrove. puoi anche scrivere:

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

E riempie l'array con i numeri indicati.

SECONDA: modificare la definizione di un oggetto esistente (cioèIl progetto della casa)

con

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

si dice qualcosa di molto semplice al vostro VM: "l'oggetto che mi danno come valore di default è molto bello, ma voglio implementare altre funzioni/proprietà" . Quindi con la clausola "estendi" si modifica la definizione di un oggetto aggiungendo o sovrascrivendo metodi/proprietà esistenti.

Esempio: un buon esempio in backbone.js è dato dalla funzione di confronto di una raccolta. Quando estendi l'oggetto definendolo, "sarà usato per mantenere la collezione in ordine".

Esempio:

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

IN GENERE

Cosa ci si aspetta di fare quando 'backboning' (sviluppando utilizzando backbone.js quadro) è quello di estendere l'oggetto dato (per esempio una visualizzazione) con:

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

e quindi utilizzarlo da qualche altra parte nel codice, una volta per ogni pulsante che si desidera gestire, incluso nel controvento s tutti i valori che si desidera dare all'oggetto

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

.... Spero che questo aiuti ...

+12

+1 per la metafora (progetto di una casa contro la casa stessa) :) –

+3

Can dici che con "estendi" crei un prototipo e con "nuovo" crei un oggetto da un prototipo ?! – netfed

14

Nel secondo caso TestModel è un contructor che si può usare più volte in seguito per creare un'istanza di modello:

var model = new TestModel(); 

Tuttavia passando title a extend ha un significato diverso. Probabilmente è meglio usare:

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

o passare il modello attribuisce durante la creazione di un oggetto:

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

Nel primo caso, d'altra parte TestModel è già un esempio di modello (quindi dovrebbe essere chiamato testModel a seguire JavaScript convenzione di denominazione):

var testModel = new Backbone.Model({ title: "test title" }) 
Problemi correlati