2011-12-24 13 views
3

私は別のものから継承するオブジェクトを持っています。子オブジェクトでは、いくつかのインスタンス変数を初期化します。親オブジェクトには、これらのインスタンス変数を使用するプライベート関数を呼び出すメソッドがあります。親関数からのインスタンス変数へのアクセス

function objA() { 
    this.funcA = function() { 
    alert(this.var); 
    funcB(); 
    }; 
    function funcB() { 
    alert(this.var); 
    }; 
} 

objB.prototype = new objA(); 
objB.prototype.constructor = objB; 
function objB() { 
    this.var ="hello"; 
    this.funcA(); 
} 

最初の警告は、私は「これは」JavaScriptで関数を呼び出すオブジェクトのアイデンティティではなく、インスタンス自体であることをunderstant「こんにちは」、未定義の二...

与えます...私はfuncBを呼び出すとき、変数が存在しない何らかの親コンテキストにいると仮定します...

私は純粋なJavaScriptの初心者です。私はそれを解決する方法を理解できません。もちろん、あなたができない私はagumentとしてそれを渡すことができ、それは非常にOOPではない、と私のプロジェクトでは、availablesを作るために多くの変数があります...プロトタイプベースの継承を使用し

おかげ

答えて

0

親から子で宣言されたアクセスプロパティ。 Mozillaのからこの開発者ガイドを参照してください。

https://developer.mozilla.org/en/JavaScript/Guide/Inheritance_constructor_prototype、特にそれが言う:「。プロパティルックアッププロトタイプチェーンを以下の一般的なプロトタイプチェーンを共有し、共通の性質を共有するすべてのオブジェクト」

子供はの「共通プロトタイプチェーン」を親と共有しますが、その逆はありません。これは、試していることを達成するための他の方法がないかもしれないということを意味するわけではありませんが、プロトタイプベースの継承はそうではないかもしれません。

1

機能を使用した後にJavaScriptを定義する機能を悪用しないでください。そのようなコードを読むのは本当に難しいです。

あなたが気づいたように、問題は継承チェーンではなく、funcB機能からthisにアクセスする方法に問題があります。 foo()を実行して関数を呼び出すことは、obj.foo()またはthis.foo()を呼び出すことと同じではありません。 thisの値は、関数の呼び出し方法によって異なります。あなたがするときobj.foo()thisobjになります。しかし、foo()に電話するとthisの値はwindowオブジェクトになります。

あなたはとてもfoo.call(obj)を書いFunction.prototype.callFunction.prototype.applyを使用して関数内でthisの値を変更することができます(今thisobjになります)。このことを念頭に置いて、あなたのコードは次のようになります。

function objA() { 
    function funcB() { 
    alert(this.var); 
    } 
    this.funcA = function() { 
    alert(this.var); 
    funcB.call(this); // <- notice .call() 
    }; 
} 

function objB() { 
    this.var ="hello"; 
    this.funcA(); 
} 
objB.prototype = new objA(); 
objB.prototype.constructor = objB; 

をまた、プロパティ名は、古いブラウザ内の単語(例えば、「VAR」)に予約することができないことに注意してください。

1

機能をfuncBの(同様に呼び出される)、関数内部「この」は、ウィンドウオブジェクトであろう。ですから、通常、オブジェクトのインスタンスに代理変数が使用されます。下にあなたはそれを行う方法を見ることができます。

function objA() { 

    var _this; 

    this.super = function(){ 
    _this = this; 
    } 

    this.funcA = function() { 
    alert(this.var); 
    funcB(); 
    }; 

    function funcB() { 
    alert(_this.var); 
    }; 
} 

objB = function objB() { 
    this.super(); 
    this.var ="hello"; 
    this.funcA(); 
} 

objB.prototype = new objA(); 

var b = new objB(); 
+0

すべてのあなたの答えをありがとう – Robert

関連する問題