如何使用javascript调用在子类中重写的方法(es5)

时间:2017-08-20 05:21:12

标签: javascript inheritance ecmascript-5

我有两个类,一个是Base Class,名为ChartBase,另一个是Sub Class,名为ChartExtend,代码如下:

/*Base Class Defined*/
function ChartBase(element, data, settings, type) {
  // do something
  this.init();
};
ChartBase.prototype = {
  init:function(){
    this.initConfig();
    // do other things;
  },
  initConfig:function(){
    this.setBaseConfig();
  },
  setBaseConfig:function(){
    // do something;
  }
}

/*Sub Class Defined*/
function ChartExtend(element, data, settings, type) {
   ChartBase.apply(this, arguments);
};
ChartExtend.prototype = {
  initConfig:function(){
    this.setBaseConfig();
    this.setExternalConfig();
  },
  setExternalConfig:function(){
    // do something;
  }
};

/*Sub Class extend Base Class*/
var TempClass = function() {};  
TempClass.prototype = ChartBase.prototype;  
ChartExtend.prototype = new TempClass(); 
ChartExtend.prototype.constructor = ChartExtend;
ChartExtend.uber = ChartBase.prototype;

/*instance*/
new ChartExtend(selector, data, settings, 'line');

我找到了' initConfig' ChartBase中调用的方法,而不是我创建实例时ChartExtend中的方法,但是,' this'指向ChartExtend in' init'功能。 enter image description here

1。为什么还要在ChartBase中调用自己的原型方法?

2。如何在ChartExtend中调用重写的方法?

1 个答案:

答案 0 :(得分:0)

首先,当您执行ChartExtend.prototype时,您将覆盖ChartExtend.prototype = new TempClass();中定义的方法。这就是为什么,当你调用initConfig方法时,它是ChartBase而不是ChartExtend

要解决此问题,您需要正确继承类,以便Sub类方法可以覆盖基类方法。请参阅以下示例。

// Base Class
function ChartBase() {}

// Prototype functions
ChartBase.prototype.initConfig = function() {
  console.log('Base Class :: initConfig');
}
ChartBase.prototype.setBaseConfig = function() {
  console.log('Base Class :: setBaseConfig');
}

// Sub Class
function ChartExtent() {
  ChartBase.apply(this, arguments);
}

// Extend base class
ChartExtent.prototype = new ChartBase()

// Define sub class prototypes
ChartBase.prototype.initConfig = function() {
  console.log('Sub Class :: initConfig');
  this.setBaseConfig();
}

// Create instance 
var instance = new ChartExtent()

// Call instance method
instance.initConfig()