ember.js - emberjs - ember onclick
Ember.js ¿cómo funciona reopenClass? (2)
En general, reopen
agrega métodos y propiedades a las instancias mientras que reopenClass
agrega métodos y propiedades a las clases .
Las pruebas correspondientes son ember-runtime/tests/system/object/reopen_test.js y packages/ember-runtime/tests/system/object/reopenClass_test.js .
He actualizado tu código y he agregado algunos comentarios, mira http://jsfiddle.net/pangratz666/yWKBF/ :
Logger = Ember.Object.extend({
log: function(thing) {
console.log(thing + '' wassup'');
}
});
var logger1 = Logger.create();
var logger2 = Logger.create();
// instances of Logger have a ''wassup'' method
try { Logger.log("1, yo"); } catch (e) {} // Object (subclass of Ember.Object) has no method ''log''
logger1.log("1, yo"); // 1, yo wassup
logger2.log("1, yo"); // 1, yo wassup
console.log(''----'');
// overwrite log of concrete logger instance logger1
logger1.reopen({
log: function(name) {
console.log(name + '' ghurt'');
}
});
try { Logger.log("1, yo"); } catch (e) {} // Object (subclass of Ember.Object) has no method ''log''
logger1.log("2, yo"); // 2, yo ghurt
logger2.log("2, yo"); // 2, yo wassup
console.log(''----'');
// classes of Logger have a ''fresh'' method
Logger.reopenClass({
log: function(name) {
console.log(name + '' fresh'');
}
});
Logger.log("3, yo"); // 3, yo fresh
logger1.log("3, yo"); // 3, yo ghurt
logger2.log("3, yo"); // 3, yo wassup
console.log(''----'');
// new* instances of Logger have from now on a ''dawg'' method
// * this will likely change in the future so already existing instances will reopened too
Logger.reopen({
log: function(name) {
console.log(name + '' dawg'');
}
});
Logger.log("4, yo"); // 4, yo fresh
logger1.log("4, yo"); // 4, yo ghurt
logger2.log("4, yo"); // 4, yo wassup
Logger.create().log("4, yo"); // 4, yo dawg
console.log(''----'');
1.
Realmente no entiendo la función de ember.js ''reopenClass. Pensé que agregaba código adicional al prototipo del Objeto, por lo que todas las instancias de ese Objeto obtendrían la funcionalidad que se agregó de una manera no estática. No hace esto sin embargo. Parece que solo agrega código que se puede ejecutar estáticamente. Por ejemplo. Tengo este código:
Logger = Ember.Object.extend({
log: function(thing) {
console.log(thing + '' wassup'');
}
});
var logger = Logger.create();
logger.log("1, yo")
logger.reopen({
log: function(name) {
console.log(name + ''ghurt'')
}
});
logger.log("2, yo")
Logger.reopenClass({
log: function(name) {
console.log(name + ''fresh'')
}
});
logger.log("3, yo")
Logger.log("4, yo")
Emite esto:
1, yo wassup
2, yoghurt
3, yoghurt
4, yofresh
Lo que esperaba es esto:
1, yo wassup
2, yoghurt
3, yofresh
4, undefined (I think)
Entonces mi pregunta es: ¿qué hace reopenClass y cuándo lo uso?
reopen
prototipo de cambios y, por lo tanto, cambia las instancias de una clase
reopenClass
cambia el constructor y, por lo tanto, cambia la clase creando propiedades estáticas y funciones que solo están disponibles en la clase, pero no en ninguna instancia de la clase.
Tenga en cuenta que los cambios introducidos al reopen
solo surten efecto después de llamar a .create()
Ejemplos de código basados en el documento:
http://emberjs.com/api/classes/Ember.Application.html#method_reopen
MyObject = Ember.Object.extend({
name: ''an object''
});
o = MyObject.create();
o.get(''name''); // ''an object''
MyObject.reopen({
say: function(msg){
console.log(msg);
}
})
try{
o.say("hey");
} catch(e) {
console.log(e); // o.say is not a function (...yet)
}
o2 = MyObject.create();
o2.say("hello"); // logs "hello"
o.say("goodbye"); // logs "goodbye"
http://emberjs.com/api/classes/Ember.Application.html#method_reopenClass
MyObject = Ember.Object.extend({
name: ''an object''
});
MyObject.reopenClass({
canBuild: false
});
MyObject.canBuild; // false
o = MyObject.create();
o.canBuild; // undefined