2017-08-19 2 views
-1

私はJavascriptを初めて使用しています。私はいくつかの目的指向プログラミングをしたとき、私はサブクラスでスーパークラスのコンストラクタを呼び出したい:`this`は` bind 'を使ってもスーパーコンストラクタのウィンドウになります

function P(p1, p2) { 
    alert(this); 
    this.v1 = p1; 
    this.v2 = p2; 
} 

var middleObj = function() {}; 
middleObj.prototype = P.prototype; 

var C = function(p1, p2) { 
    P.bind(this, p1, p2); 
    P(); 
} 
C.prototype = new middleObj(); 
C.prototype.constructor = C; 

var objChild = new C(1,2); 
alert(objChild instanceof P); 
alert(objChild.v2); 

私はC(中P()を直接)を呼び出すと、これはwindowになり、私は理解することができますそれ。しかし、私がこれをC()に束縛しても、私はthisの適切な値を得ることができません。その結果、v2が適切に初期化されていないため、2番目のアラートが未定義と表示されます。

+0

を使用することをお勧めのように、あなたはそれを参照してくださいよ彼らは常に 'bind'の戻り値を使用します(そしてなぜそれらを説明します)。 –

答えて

1

P.bind()は関数を返しますので、再度Pに割り当てる必要があります。あなたがリンクされdupetargetで回答で、より密接に見れば、この

P = P.bind(this, p1, p2) 

しかし、この場合には、私はあなただけP.call(this, p1, p2);

function P(p1, p2) { 
 
    alert(this); 
 
    this.v1 = p1; 
 
    this.v2 = p2; 
 
} 
 

 
var middleObj = function() {}; 
 
middleObj.prototype = P.prototype; 
 

 
var C = function(p1, p2) { 
 
    P.call(this, p1, p2); 
 
} 
 
C.prototype = new middleObj(); 
 
C.prototype.constructor = C; 
 

 
var objChild = new C(1,2); 
 
alert(objChild instanceof P); 
 
alert(objChild.v2);

+0

ご清聴ありがとうございます。それは解決される –

関連する問題