props emberjs ember create component classnamebindings bubbling ember.js

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