2011-07-04 17 views
1

私はJavaScriptのOOPを初めて使っています。私はメソッドをオーバーライドしたいときにそれを正しく取得できません。私は下の私の問題の例を作った。またhttp://jsfiddle.net/sRyQA/JavaScriptメソッドのオーバーライド

function myGeometryObject(r, x, y){ 

    this.r = r; 
    this.x = x; 
    this.y = y; 

    var OBJ = this; 

    this.returnArea = function(){ 
     return 'wrong override'; 
    } 
} 

function myRectangle(r, x, y){ 
    myGeometryObject.call(this, r, x, y); 
} 
myRectangle.prototype = new myGeometryObject(); 

myRectangle.prototype.returnArea = function(){ 
    return 'right override';//I want JS to use this method 
} 
var rectangle = new myRectangle(0, 5, 5); 
alert(rectangle.returnArea()); 

答えて

8

に問題は(あなたが正しく新しいMyRectangleインスタンス上の親のコンストラクタを呼び出しているよう)

this.returnArea = function(){ 
    return 'wrong override'; 
} 

は、その特定のインスタンスのプロパティを設定することで、すべての継承されたメソッドを「オーバーライド」します。

あなたのプロトタイプチェーンは次のようになります。インスタンスでretunArea方法は、あなたがMyGeometryObjectコンストラクタに割り当てる1及び試作品の一つである

+------------------+  +------------------+  +------------------+ 
| MyRectangle  |  | MyRectangle  |  | MyGeometry  | 
| instance   |------->| prototype  |------->| prototype  | 
|     |  |     |  |     | 
| wrong returnArea |  | right returnArea |  |     | 
+------------------+  +------------------+  +------------------+ 
          (MyGeometry instance) 

はあなたが上書きされているものです。

しかし、あなたはプロトタイプチェーン内に早く来る権利として、returnArea方法をMyGeometryObjectのその後prototype

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

MyGeometryObject.prototype.returnArea = function(){ 
    return 'wrong override'; 
} 

それが動作するには、このメソッドを割り当てる場合:

+------------------+  +------------------+  +------------------+ 
| MyRectangle  |  | MyRectangle  |  | MyGeometry  | 
| instance   |------->| prototype  |------->| prototype  | 
|     |  |     |  |     | 
|     |  | right returnArea |  | wrong returnArea | 
+------------------+  +------------------+  +------------------+ 
          (MyGeometry instance) 

さらにノート:

  • コンストラクタの関数名は、大文字で始まる必要があります。
  • あなたがMyRectangleのプロトタイプをこのように設定した場合、あなたはまた戻っMyRectangleからconstructorプロパティを設定する必要があります。

    MyRectangle.prototype = new MyGeometryObject(); 
    MyRectangle.prototype.constructor = MyRectangle; 
    
+0

を別の方法を適用した後に 'myRectangle'コンストラクタ(方法を上書きすることです'myGeometryObject'コンストラクタへの引数)。 http://jsfiddle.net/sRyQA/2/ – katspaugh

+0

@Felix KLing MyRectangle.prototype.constructor = MyRectangleとは何ですか? – einstein

+0

@ Woho87:プロトタイプの 'constructor'プロパティを' MyRectangle'に設定します。このプロパティは、プロトタイプがプロトタイプの関数であることを常に指し示します。試してみましょう: 'function Foo(){}; console.dir(Foo.protoype); '。 –

関連する問題