John Resig继承类和重写方法 - 调用错误的方法

时间:2015-04-10 15:21:10

标签: javascript inheritance

我正在尝试使用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。

为了防止这种情况发生,我能做些什么吗?

1 个答案:

答案 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
    }
});

动态调度是自然和预期的行为。通常,您在superB::doStuff之间也会进行A::doStuff来电。

请注意,这与super来电或使用Resig的语法糖没有任何关系。