ember.js の reopenClass の機能がよくわかりません。オブジェクトのプロトタイプに追加のコードを追加して、そのオブジェクトのすべてのインスタンスが非静的な方法で追加された機能を取得すると考えていました。しかし、これは実行されません。静的に実行できるコードのみを追加するようです。たとえば、次のようなコードがあります。
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")
出力は次のようになります:
1, yo wassup
2, yoghurt
3, yoghurt
4, yofresh
私が期待していたのはこれです:
1, yo wassup
2, yoghurt
3, yofresh
4, undefined (I think)
そこで質問です。reopenClass は何をするもので、いつ使うのでしょうか?
ベストアンサー1
一般的に、reopen
メソッドとプロパティを追加しますインスタンス一方、reopenClass
メソッドとプロパティを追加しますクラス。
対応するテストはエンバーランタイム/テスト/システム/オブジェクト/reopen_test.jsそしてパッケージ/ember-runtime/tests/system/object/reopenClass_test.js。
コードを更新し、コメントを追加しました。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('----');