2012-02-01 5 views

Respuesta

74

Hay una diferencia básica, que en definitiva puede ser descrito como "la diferencia entre el proyecto de una casa y la casa misma ".

Para los programadores expertos me acaba de decir que "nueva Backbone.Model" devuelve una instancia de objeto, pero "Backbone.Model.extend" devuelve una función constructora

PRIMERO: un nuevo objeto (es decir, la casa)

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

se crea un nuevo objeto cuya estructura (métodos y variables) se han definido en otro lugar. El objeto se puede considerar como "todos los elementos no nativos" de un idioma, mientras que para "elemento nativo" me refiero a los tipos básicos como enteros, caracteres, etc.

En las llaves {} se pasa el valor de alguna variable o método. Esto se llama, como Tomasz Nurkiewicz explicó anteriormente, un constructor, porque le permite 'construir' un nuevo objeto cuyo modelo se ha descrito en otra parte.

Para darle un ejemplo conocido: se escribe

var myArray = new Array(); 

Significa que va a crear una nueva matriz, que es un objeto no nativo que ha sido definida en otro lugar. también puede escribir:

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

Y llena la matriz con los números dados.

SEGUNDO: modificar la definición de un objeto existente (es decir,El proyecto de la casa)

con

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

que decir algo muy simple a su VM: "el objeto que me dan por defecto es muy agradable, pero yo quiero implementar más funciones/propiedades" . Entonces con la cláusula "extender" usted modifica la definición de un objeto que agrega o anula el método/propiedades existentes.

Ejemplo: un buen ejemplo en backbone.js viene dado por la función de comparación de una colección. Cuando extiende el objeto que lo define, "se usará para mantener la colección en orden ordenado".

Ejemplo:

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

EN GENERAL

Lo que se espera que haga cuando 'backboning' (en desarrollo que utilizan marco Backbone.js) es extender el objeto dado (por ejemplo, una Vista) con:

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

y luego usarlo en otro lugar en el código, una vez para cada botón que desee manejar, incluso en el corsé s Todos los valores que desea dar al objeto

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

.... Espero que esto ayude ...

+12

+1 de la metáfora (proyecto de una casa frente a la propia casa) :) ¿Puede –

+3

dices que con "extender" creas un prototipo, y con "nuevo" creas un objeto de un prototipo? – netfed

14

En el segundo caso TestModel es un contructor que se puede utilizar varias veces después de crear una instancia de modelo:

var model = new TestModel(); 

Sin embargo title pasar a extend tiene un significado diferente. Probablemente debería utilizar:

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

o pasar el modelo atribuye al crear un objeto:

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

En el primer caso, por otra parte TestModel ya es una instancia de modelo (por lo tanto debe ser nombrado testModel a seguir convención de nomenclatura de JavaScript):

var testModel = new Backbone.Model({ title: "test title" }) 
Cuestiones relacionadas