我正在尝试使用John Resig的继承类来扩展我正在开发的一些类。 这些类具有被覆盖的方法。尽管如此,也应该调用这些方法的原始版本。 我的问题是,当我尝试在超类上调用一个方法时,它会调用覆盖原始方法的方法。
以下面的代码为例:
var A = Class.extend({
init: function(){
this.doStuff(); // this invokes doStuff from B instead of A
},
doStuff: function(){
// does stuff on the super class
}
});
var B = A.extend({
init: function(){
this._super();
this.doStuff();
},
doStuff: function(){
// does stuff on the sub class
}
});
当我创建B的实例时:
var test = B.create();
一旦调用了来自A(超类)的init方法,就会调用来自B的doStuff,而不是A类中的doStuff。
为了防止这种情况发生,我能做些什么吗?
答案 0 :(得分:1)
为了防止这种情况发生,我能做些什么吗?
是的,您需要通过显式引用要调用的方法来调用该方法,而不是在实例上动态调度它:
var A = Class.extend({
init: function(){
A.prototype.doStuff.call(this); // always invokes doStuff from A
},
doStuff: function(){
// does stuff on the super class
}
});
动态调度是自然和预期的行为。通常,您在super
到B::doStuff
之间也会进行A::doStuff
来电。
请注意,这与super
来电或使用Resig的语法糖没有任何关系。