gpt4 book ai didi

Ember.js ReopenClass 如何工作?

转载 作者:行者123 更新时间:2023-12-02 13:22:00 26 4
gpt4 key购买 nike

我不太明白ember.js的reopenClass的功能。我认为它向对象的原型(prototype)添加了额外的代码,因此该对象的所有实例都将获得以非静态方式添加的功能。然而它并没有这样做。看起来它只添加了可以静态执行的代码。例如。我有这个代码:

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 做什么以及何时使用它?

最佳答案

一般来说,reopen实例 添加方法和属性,而 reopenClass 添加方法和属性。

对应的测试是ember-runtime/tests/system/object/reopen_test.jspackages/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('----');

关于Ember.js ReopenClass 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10269372/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com