2011-07-07 15 views
1

関数呼び出し()を呼び出すことと継承したクラスの暗黙のコンストラクタを呼び出すことの違いは何ですか?call()関数と継承クラスの暗黙のコンストラクタの呼び出し

例1:

function DepthRectangle(w, h, d){ 
    Rectangle.call(this, w, h); 
    this.depth = d; 
} 

例2:

function DepthRectangle(w, h, d){ 
    this = new Rectangle(w, h); 
    this.depth = d; 
} 

Rectangleのコンストラクタ:

function Rectangle(w, h){ 
    this.width = w; 
    this.height = h; 
} 
+0

私の意見では、このサイトはFacebookを殺すでしょう。 :D –

答えて

3

thisの値が割り当てられないため、2番目の例は機能しません。の左辺の代入式が有効ではありません。

しかし、あなたが持っているとします。この場合

function DepthRectangle(w, h, d){ 
    var obj = new Rectangle(w, h); 
    obj.depth = d; 
    return obj; 
} 

を、違いは、この関数によって返されるオブジェクトはRectangle.prototypeからではなく、DepthRectangleから直接継承することになります。例えば

、上記の機能を有する:最初の例で

//... 
DepthRectangle.prototype.inherited = "foo"; 
Rectangle.prototype.inherited = "bar"; 

var obj = new DepthRectangle(1,2,3); // note: new is not really needed 
obj.inherited; // "bar", from Rectangle.prototype 
obj instanceof DepthRectangle; // false 

call方法を使用することだけが、DepthRectangleで作成されたオブジェクトを指すthis値と、Rectangle機能を実行しますこのオブジェクトは実際にはまだDepthRectangle.prototypeから継承されます。

+0

+1 - クールですが、新しいだけではありません*新しいDpethRectangle *では、munged継承のために誤解を招きます。関数 "creatDepthRectangle"または同様のものを呼び出す方がよいでしょう。 – RobG

2

まあ、1のために、割り当てthis = new Rectangle(w, h)おそらく

をスローします

.call()は、あなたがしたいことと同じことを基本的に実行できます。呼び出す関数内でthisの値を設定できるようにすることで機能します。別の関数コンストラクタを呼び出す場合は、コンストラクタに現在のthisオブジェクトに適用されます。

このように、Rectangleのプロトタイプはコピーされませんので、それを考慮する必要があります。

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/function/call

2

関数呼び出し()を呼び出して、継承されたクラスの暗黙のコンストラクタを呼び出すの違いは何ですか?

JavaScriptには暗黙のコンストラクタはありません。

コード

Rectangle.call(this, w, h); 

... Rectangle内、thisthisには、呼び出し元のコードで参照するオブジェクトを指すようになります。コード

new Rectangle(w, h); 

... Rectanglethisnewオペレータによって作成された新しいオブジェクトを参照します。

再例2:あなたがthisに割り当てることができません

this = new Rectangle(w, h); 

thisは、関数の呼び出し方法によって設定され、関数の処理中は変更できません。階層を作成するときに具体的に、

Rectangle.call(this, w, h); 

イディオムは、新しく作成されたオブジェクトは、現在のコンストラクタ(あなたのケースでDepthRectangle)が再したいと思われるので、Rectangleもので初期化されていることを保証するために使用される

その機能を使用してください。

+1

私はあなたがT.Jであるという事実に基づいてupvoteに行くつもりです。クラウダー。 – Robert

+0

@ロバーツ:それは奇妙です。私は逆の反作用をしてきましたが、これを前に思い出すことはありません。 ;-) –

+0

+1 -oopsは-1だったはずなので、もっと快適になるはずです...; -p – RobG

関連する問題