Dado que los getters/setters son compatibles con IE9+ y serán mucho más frecuentes con ES6, sería bueno que el método de extensión de Backbone los admitiera.
var Person = Backbone.Model.extend({
get fullName() {
return this.get('firstName') + ' ' + this.get('lastName');
}
});
var elonMusk = new Person({
firstName: 'Elon',
lastName: 'Musk'
});
console.log(person.fullName); // >> Elon Musk
En este momento, esto daría como resultado undefined is not a function
porque usar _.extend
es llamar al captador.
¿Hay alguna razón por la que no podría escribirse mejor como person.fullName()
para que sepa que es una llamada de función?
El uso de getters y setters es en su mayor parte una mala idea en JS, y van en contra de una de las ideas centrales de Backbone Models. Dudo que veas soporte agregado en el corto plazo.
Más que nada, esto estaría parcialmente alineado con la nueva sintaxis de clase. No hay inicializadores de propiedad en la sintaxis de la clase o incluso ninguna especificación para ellos todavía, por lo que la interoperabilidad será un problema.
van en contra de una de las ideas centrales de Backbone Models.
¿Qué idea central es esa?
También los getters son una solución parcial a un problema existente en Backbone.Collection con model.idAttribute
.
Pasé unos minutos tratando de hacer un jsperf con diferentes soluciones:
http://jsperf.com/backbone-extend-with-define-property
¿Qué idea central es esa?
La idea de que establecer y recuperar una propiedad en un objeto debe ser transparente y lógico para razonar. Siempre debe saber que obj.prop = val
nunca hace otra cosa que establecer ese valor de propiedad (lo mismo para la recuperación), mientras que debemos usar funciones para manejar cosas como propiedades calculadas y eventos de cambio. Esa es la razón principal de los métodos de envoltura get
y set
alrededor attributes
en primer lugar.
Además, los captadores son una solución parcial a un problema existente en Backbone.Collection con model.idAttribute.
¿Alguna razón por la cual el envoltorio _.result
actual no funciona para esto? idAttribute
puede ser una primitiva o una función. Esto también se está arreglando con modelId
.
Lo siento, debería haberme vinculado al problema del que estaba hablando: https://github.com/jashkenas/backbone/issues/3408
Menciono esto principalmente porque la sintaxis de clase de Backbone ya es en gran parte compatible con la sintaxis de clase ES, y parece razonable que sean compatibles considerando el soporte adicional para coffeescript.
CoffeeScript no es compatible con setters y getters en gran medida por las mismas razones (busque los problemas allí para conocer algunos antecedentes, comenzando con https://github.com/jashkenas/coffeescript/pull/2902). No deberían ser un obstáculo para admitir objetos Backbone como clases.
Lo siento, debería haber vinculado al problema del que estaba hablando: # 3408
¿Recuerdame? Me estoy esforzando por ver la conexión desde el principio.
Además, cualquier cambio en extend
tendría que hacerse en _.extend
, no aquí. Cerrando como un wontfix.
CoffeeScript no admite setters y getters en gran parte por las mismas razones
No estaba hablando de getters/setters, estaba hablando de cómo Backbone agregó __super__
para la interoperabilidad con CoffeeScript, y cómo solo tiene sentido que sea compatible con las clases de ES6 de la misma manera.
¿Recuerdame? Me estoy esforzando por ver la conexión desde el principio.
Collection.extend({
model: function() { return Model }
});
//
collection.modelId(model); // 'id' regardless if that's correct or not.
Collection.extend({
get model() { return Model }
});
//
collection.modelId(model); // correct for *some* of the common cases.
Además, cualquier cambio para extender tendría que hacerse en _.extend, no aquí. Cerrando como un wontfix.
Definitivamente ese no es el lugar correcto para este cambio, en todo caso sería en el nuevo método _.assign
. Pero tiene mucho más sentido que sea compatible aquí, en mi opinión.
Además, antes de que este problema se cierre y se olvide, me gustaría abordar por qué está bien que la extensión de Backbone tenga problemas de interoperabilidad con las clases ES pero no con las clases CoffeeScript.
Bueno, dado que IE Tech Preview es el único navegador con soporte incluso remotamente decente de class
(incluso Traceur y 6to5 aún no convierten extends
), estamos muy lejos de esto incluso siendo necesario. Aparte de eso, Backbone no se esforzará por romper la compatibilidad con versiones anteriores solo para admitir una función que, para empezar, no es una gran idea.
incluso Traceur y 6to5 aún no convierten
extends
En realidad, ambos lo hacen, solo requieren soporte para __proto__
para propiedades estáticas que son ampliamente compatibles.
Además, no hay razón para romper la compatibilidad con palabras anteriores, incluso podría hacerse más rápido si usara selectivamente Object.setPrototypeOf
cuando esté disponible.
@thejameskyle ¿Quiere convertir esto en relaciones públicas en lugar de un problema? Vale la pena mirar.
Claro, eso haré
¿Está en camino? ¿Tiene usted una esencia o algo al respecto? Me gustaría tomar una foto.
Comentario más útil
Claro, eso haré