我们使用John Resig的inherit.js。这使我们可以访问方便的_super()
函数来调用父函数。这太棒了,但今天我被一个问题困住了,我无法从this._super()
内部拨打setTimeout
,即使我绑定了这个:
var Person = Class.extend({
init: function(isDancing){
this.dancing = isDancing;
},
dance: function(){
return this.dancing;
}
});
var Ninja = Person.extend({
init: function(){
this._super( false );
},
dance: function(){
window.setTimeout(function(){
// Call the inherited version of dance()
return this._super();
}.bind(this),50);
});
this._super()
未定义!发生了什么事?
答案 0 :(得分:4)
要完成这项工作,您需要在子类方法中捕获_super方法,如下所示:
dance: function(){
// capture the super method for later usage
var superMethod = this._super;
window.setTimeout(function(){
return superMethod();
},50);
};
这个工作的原因,而你的代码没有,是inherit.js中的extend()
方法捕获超类'
在重写方法运行之前,方法为this._super
。然后它运行你的代码,并在你的代码之后
运行它将_super恢复到运行之前设置的任何内容。该操作发生在inherit.js
var tmp = this._super;
// Add a new ._super() method that is the same method
// but on the super-class
this._super = _super[name];
// The method only need to be bound temporarily, so we
// remove it when we're done executing
var ret = fn.apply(this, arguments);
this._super = tmp;
return ret;
更具体一点;当运行原始代码时,用作setTimeout参数的函数被绑定到原始对象。它不起作用的原因是,即使this
引用了正确的对象,this._super
引用了其他内容,因为this._super
被重置为指向方法运行之前指向的任何内容。可能它没有设置,因此this._super
的值很可能只是undefined
。
答案 1 :(得分:2)
这表明丑陋Class
is implemented。 _super
属性将在dance
运行期间可用,之后将被删除(或恢复),因为它需要特定于当前正在执行的方法。您需要获取对“当前”_super
值的引用,并从超时中调用该值。简而言之:
dance: function(){
// Call the inherited version of dance()
window.setTimeout( this._super.bind(this), 50);
}