2012-02-15 13 views
3

親から子オブジェクトに継承されたメソッドから変数へのアクセス可能性を調べています。JavaScriptからの変数アクセス継承メソッド

継承が子供のコンストラクタのプロトタイプに親のインスタンスを関連付ける実行されます。

Function.prototype.extend = function(child) { 
    var prototype = new this; 

    child.prototype = prototype; 
    return child; 
}; 

は、だから私は、親クラスを定義します。

var Parent = function() { 
    var self = this; 

    this.init = function() { 
     self.name = 'Abram'; 
    }; 
    this.getName = function() { 
     alert('self.name = ' + self.name); 
    }; 
    this.init(); 
}; 

と子クラス:

var Baby = Parent.extend(function(name) { 
    var self = this; 

    this.init = function() { 
     self.name = name; 
    }; 
    this.init(); 
}); 

// instantiate a child object: 
var baby = new Baby('Jimmy'); 

// call the inherited method: 
baby.getName(); // undefined! 

メソッドgetNameは正しく継承されますが、 self.nameメンバーにアクセスすることはできません。
子クラスインスタンスのスコープで利用できる場合はどうでしょう。

alert(baby.getName)とメソッドの本体を確認する私が取得:私が期待まさにある

function() { 
    alert("self.name = " + self.name); 
}


なぜローカルでself変数が解決されないのですか?

答えて

3

親「getName()」関数の変数「self」は、インスタンスを指します。子の "init"関数は、プロトタイプオブジェクトではなく、そのオブジェクトの名前を設定します。したがって

:なし「のgetName」プロパティにはありませんので、文字列「ジミー」

  • baby.getName();に設定し、「名前」プロパティを持つオブジェクトで

    1. var baby = new Baby("Jimmy");結果は、プロトタイプオブジェクトの関数を呼び出します"赤ちゃん"オブジェクト。その関数の中で、変数 "self"が参照されます。この変数は、オブジェクト "baby"に対するプロトタイプオブジェクト— ではなく、です。プロトタイプオブジェクトには「名前」プロパティが設定されていません。

    あなたはthis.name代わりのself.nameを使用するためにプロトタイプで.getName()機能を変更した場合に何が起こるかを参照してください。

  • +0

    ありがとうございました。私はすでにself.nameをthis.nameに変更しようとしましたが、それは動作します(そのレベルではまだクロージャではありません)。しかし、ローカルに名前が付けられたメンバーは、ネストされた関数スコープでそれらをマージするなど、効果的なコード再利用のために。 –

    +0

    問題は、「親」関数での「自己」のバインディングが常に元のオブジェクトインスタンスになることです。それは閉鎖のためにそこに「ついた」。 – Pointy