2016-04-29 5 views
6

私はJavaScriptでオブジェクト階層を作成していますが、そのオブジェクトのメソッドをシャドウしたときにオブジェクトの親に対してメソッドを呼びたいと思います。シンプルな/より良い方法は、シャドープロトタイプメソッドを呼び出すには?

例えば:

var Base = function Base(msg) { 
    this.msg = msg; 
} 
Base.prototype.log = function(){ 
    console.log("base log: " + this.msg); 
} 

var Sub = function Sub(msg) { 
    Base.call(this, msg); 
} 

Sub.prototype = Object.create(Base.prototype); 

Sub.prototype.log = function() { 
    console.log("sub log"); 

    this.__proto__.__proto__.log.call(this); // This works but __proto__ 
    Object.getPrototypeOf(Object.getPrototypeOf(this)).log.call(this); // This works but is verbose 
    super.log(); // This doesn't work 
} 

var sub = new Sub('hi'); 
sub.log(); 

Sub.prototype.log機能の下部に3行を参照してください - 私はそこに何をしようとしている行うには良い方法はありますか?

2番目の行は私が思いついた最高ですが、非常に冗長です!

+0

私はこれがhttp://codereview.stackexchange.comに属していると感じているので、この質問をオフトピックとして閉じるよう投票しています。 – Dom

+4

おそらく、私はレビューを求めているとは思わない、私は言語の仕組みやパターンがあるかどうか疑問に思っています。私は何をしようとしているのか、どちらが適しているのか分かりません。 stackoverflowがそれのための適切な場所でない場合、訂正されてうれしいです。 – sync

+1

質問にはnode.jsというタグが付いているので、es6クラスを使用することもできます。 – hassansin

答えて

2

superは定義されていませんが、明らかに動作しません。

あなたがしようとする場合があります:

Sub.prototype.log = function() { 
    console.log("sub log"); 

    Base.prototype.log.call(this); 
} 

もう一つの方法は、クラスを継承するために、次の方法を使用することです。だからここ

function extend(Child, Parent) { 
    var F = function() { }; 
    F.prototype = Parent.prototype; 
    Child.prototype = new F();  

    // better to make it static (better practice in OOP world) 
    // e.g. Child.super = ..., 
    // but in your case: 
    Child.prototype.super = Parent.prototype;  
} 

は一例です:で

// .. 
extend(Sub, Base); 

Sub.prototype.log = function() { 
    console.log("sub log"); 

    this.super.log.call(this); 
} 

大文字の場合:ES6

class Base { 
    constructor(msg) { 
    this.msg = msg; 
    } 

    log(){ 
    console.log("base log: " + this.msg); 
    } 
} 

class Sub extends Base { 
    constructor(msg) { 
    super(msg); 
    } 

    log() { 
    console.log("sub log"); 
    super.log(); 
    } 
} 

var sub = new Sub('hi'); 
sub.log(); 
+0

ありがとう、それはきれいです。私はそこに 'Base'オブジェクト名をハードコード化したくないのですが - 私は' super'が私のユースケースではうまくいかないことを知っていますが、これは私がやりたいことです。あなたの親のプロトタイプ '。 – sync

+0

@syncは答えを更新しました –

1

Baseという名前を使用せずに元のメソッドを保持したい場合は、変更する前にクロージャを使用してキャプチャできます。

(function() { 
    var superLog = Sub.prototype.log; 
    Sub.prototype.log = function() { 
     console.log("sub log"); 
     superLog(); 
    }; 
})(); 

あなたはBaseから継承方法には依存性がないこの方法です。

サイドノート:あなたが探している用語は、ベースメソッドを「オーバーライド」しています。

+0

ありがとうございました。 – sync

関連する問題