2011-09-29 24 views
3

私はjavascriptで 'classes'を操作する方法を学びたいと思っています。Javascriptクラス継承

function Shape(x, y) { 
    this.x= x; 
    this.y= y;  
} 

Shape.prototype.toString= function() { 
     return 'Shape at '+this.x+', '+this.y; 
    }; 

function Circle(x, y, r) { 
    Shape.call(this, x, y); // invoke the base class's constructor function to take co-ords 
    this.r= r; 
} 
Circle.prototype= $.extend(true, {}, Shape.prototype); 

Circle.prototype.toString= function() { 
    return 'Circular '+Shape.prototype.toString.call(this)+' with radius '+this.r; 
} 

var c = new Circle(1,2,3); 
alert(c); 

はそれのコンストラクタの内部で形状のtoString関数を定義する方法はありますか、それはこのような状況では意味がありません。ここで

は私のコードですか?

+0

この場合、 'this.toString = function(){...}'は機能しませんか? – Connell

+0

いいえ、そうではありません。相違点を参照してください。 http://jsfiddle.net/paptamas/qDSkj/ および http://jsfiddle.net/paptamas/cbnLB/ –

+1

プロトタイプは正しい方法です。一度toString関数を作成します。コンストラクタでは、新しいものごとに作成されます。 – Joe

答えて

0

私の理解の基本:

  1. あなたが.toStringコンストラクタに.toStringを()を移動()インスタンスの明示的なメンバーになります。そのため、.toString()を呼び出すとその明示的なメンバーが起動します。

例:http://jsfiddle.net/paptamas/qDSkj/

  1. しかし、あなたは().toString(と呼ばれる明示的なメンバーがない場合)のプロトタイプとして、任意の.toString()メソッドを呼び出して発動することを定義します。呼び出しオブジェクトの型(あなたの場合は円)に対して定義されているtoString()関数

例:つまりhttp://jsfiddle.net/paptamas/cbnLB/

、明示的なメンバーは、プロトタイプの定義よりも優先され、あなたが

this.toString = function() ... 

を言うとき、あなたはあなたのインスタンスのメンバーとして、その関数を定義している(に反対するとして、あなたのタイプのメンバ - 最適化されていない方法です)。

よろしくお願いいたします。