クラスのメソッドをオーバーライドしたい場合

http://jsdo.it/qa/69

by FiNGAHOLiC

HTML

<script src="https://getfirebug.com/firebug-lite-debug.js"></script>

JavaScript

/*!
 *
 * クラスのメソッドをオーバーライドしたい場合
 *
 */

// スーパークラスの定義
var SuperClass = function(){};

SuperClass.prototype.doSomething = function(){
    console.log('I\'m SuperClass method');
};

// サブクラスの定義
var SubClass = function(){
    // スーパークラスのコンストラクタ関数の呼び出し
    SubClass.apply(this, arguments);
};

// 継承
SubClass.prototype = new SuperClass();

// オーバーライド
SubClass.prototype.doSomething = function(){
    console.log('I\'m SubClass method');
};

/*!
 *
 * サブクラスのメソッドからスーパークラスのメソッドを呼び出す方法
 *
 */

// スーパークラスが既知の場合
SubClass.prototype.doSomething = function(){
    var _super = SuperClass.prototype;
    _super.doSomething.apply(this, arguments);
};

// スーパークラスが未知の場合1
// __proto__を用いる方法
SubClass.prototype.doSomething = function(){
    var _super = SubClass.prototype.__proto__;
    _super.doSomething.apply(this, arguments);
};

// スーパークラスが未知の場合2
// ES5のgetPrototypeOf()を用いる方法
SubClass.prototype.doSomething = function(){
    var _super = Object.getPrototypeOf(SubClass.prototype);
    _super.doSomething.apply(this, arguments);
};

// スーパークラスが未知の場合3
// constructorを用いる方法
SubClass.prototype.doSomething = function(){
    var _super = SubClass.prototype.constructor.prototype;
    _super.doSomething.apply(this, arguments);
};