2

形状は長方形に継承されます。この継承は、多くの方法で行うことができます。ここでは、apply() と call () を使用しました。draw メソッドが child で呼び出されると、そのメソッドから再び基底クラスの draw メソッドが呼び出されます。私はこれを2つの方法で行いました。1 つは基本クラスの draw メソッドのプロトタイプを作成する方法で、もう 1 つは apply() および call() メソッドを使用する方法です。
最初の方法:

function Shape () {
  this.name='Shape';
  this.getName = function () {
   return this.name;
  };
  this.draw = function () {
   alert("Something");
  };
} 

function Rectangle () {
  Shape.apply(this);
  var X=this.draw;
  this.name = 'rectangle';
  this.id=500;
  this.draw = function () {
    X.call(this);
  };
}

2番目の方法:

function Shape () {
  this.name='Shape';
  this.id=100;
  this.getName = function () {
    return this.name;
  };
}

Shape.prototype.draw = function() {
  alert("Something");
};

function Rectangle () {
  this.name = 'rectangle';
  this.id=200;  
  this.draw = function () {
    Shape.prototype.draw.call(this);
  };
}

Rectangle.prototype = new Shape();
Rectangle.prototype.constructor = Rectangle;

これら 2 つの方法はどちらも同様のことを行います (出力を提供する場合)。apply () および call () メソッドを使用しても、基本クラスのプロトタイプに直接アクセスできないことはわかっています。apply() と call() を使用した継承は、それほど複雑ではないように思えます。両方が同じなら、apply() と call() をあまり使わないのはなぜですか? なぜプロトタイプを使用する必要があるのですか? プロトタイプを使用せず、apply() と call () を使用して基本クラスを継承すると、どのような問題に直面するでしょうか??

4

2 に答える 2

0

違いの 1 つは、Rectangle クラスの「描画」関数がインスタンス変数であることです。そのため、Rectangle のすべてのインスタンスでメモリが使用されます。

さらに、プロトタイプを使用していて、親メソッドの動作をまったく変更したくない場合 (たとえば、2 番目の例では、Rectangle の 'draw' メソッドは draw メソッド以外のことは何もしません) Shape の場合、メソッド再定義する必要はまったくありません。長方形で「draw」を呼び出すと、ランタイムはプロトタイプチェーンを上って、Shape で正しいものを見つけます。

したがって、2番目の例は次のようになります。

function Shape () {
  this.name='Shape';
  this.id=100;
}

Shape.prototype.getName = function () {
  return this.name;
};

Shape.prototype.draw = function() {
  alert("Something");
};

function Rectangle () {
  this.name = 'rectangle';
  this.id=200;  
}

// Notice we don't repeat "getName" since it is defined in 
// the parent class, and there is no need to do something else. 

// In case you actually want to "override" the behavior
Rectangle.prototype.draw = function () {
  Shape.prototype.draw.call(this);
  alert("Do something else than Shape");
};

Rectangle.prototype = new Shape();
Rectangle.prototype.constructor = Rectangle;
于 2013-05-09T11:38:05.630 に答える