1. ホーム
  2. javascript

[解決済み] JavaScriptオーバーライドメソッド

2023-01-29 17:17:29

質問

以下のようなコードがあるとします。

function A() {
    function modify() {
       x = 300;
       y = 400;
    }

    var c = new C();
}

function B() {
    function modify(){
       x = 3000;
       y = 4000;
    }

    var c = new C();
}

C = function () {
   var x = 10;
   var y = 20;

   function modify() {
      x = 30;
      y = 40;
   };

   modify();
   alert("The sum is: " + (x+y));
}

さて、問題は、このメソッドをオーバーライドして modify から C の中にあるメソッドで AB . Javaでは super -というキーワードを使いますが、JavaScriptでこのようなことを実現するにはどうしたらよいでしょうか?

どのように解決するのですか?

編集:最初の回答が書かれてからもう6年になりますが、多くのことが変わりましたね。

  • 新しいバージョンの JavaScript を使用している場合、おそらく次のようなツールでコンパイルされたものです。 バベル のようなツールでコンパイルされている場合は 実際のクラスを使用する .
  • で提供されるクラスのようなコンポーネントコンストラクタを使用している場合、そのクラスは Angular または リアクト を使用する場合は、そのフレームワークのドキュメントを参照する必要があります。
  • ES5を使用していて、プロトタイプを使用して手作業でquot;fake"クラスを作成している場合、以下の回答はこれまでと同様に正しいものです。

幸運を祈ります。


JavaScriptの継承は、Javaとは少し異なっています。以下は、JavaScriptのネイティブなオブジェクトシステムの様子です。

// Create a class
function Vehicle(color){
  this.color = color;
}

// Add an instance method
Vehicle.prototype.go = function(){
  return "Underway in " + this.color;
}

// Add a second class
function Car(color){
  this.color = color;
}

// And declare it is a subclass of the first
Car.prototype = new Vehicle();

// Override the instance method
Car.prototype.go = function(){
  return Vehicle.prototype.go.call(this) + " car"
}

// Create some instances and see the overridden behavior.
var v = new Vehicle("blue");
v.go() // "Underway in blue"

var c = new Car("red");
c.go() // "Underway in red car"

残念ながら、これは少し醜く、"super" への非常に良い方法を含んでいません: あなたは、呼び出したい親クラスのメソッドを手動で指定する必要があります。そのため、クラスをよりきれいに作成するためのさまざまなツールがあります。Prototype.js、Backbone.js、またはjsでOOPを行うためのより良い構文を含む同様のライブラリを見てみてください。