0

初期化の大部分を共有するいくつかの疑似クラスがありました。この初期化を取り除いて、それらが継承する基本クラスを作成することにしました。

function BaseClass(param1, param2) {
    ...
}

function SubClassA(param1) {
    ...
}

function SubClassB(param1) {
    ...
}

次の方法で継承したいSubClass1と思います。SubClass2BaseClass

SubClassA(param1)コンストラクター呼び出しBaseClass(param1, "I am A.")

SubClassB(param1)コンストラクター呼び出しBaseClass(param1, "I am B.")

したがってBaseClass、それらにいくつかのプロパティを追加します。次に、両方のサブクラスが独自の初期化を行います。

SubClassA.prototype = new BaseClass()スーパーコンストラクターにパラメーターを取得させたいので、今はできません。これをエレガントに行う方法は?

4

5 に答える 5

2
function SubClassA(param1) {
    BaseClass.call(this, param1, "I Am A.");
}

function SubClassB(param1) {
    BaseClass.call(this, param1, "I Am B.");
}

new SubClassA(param1)またはnew SubClassB(param1)ベースコンストラクターを実行すると、適切なパラメーターを使用して呼び出されます。

SubClassA.prototype = new BaseClass()また、基本クラスを定義する以外の方法もあります。詳細については、この質問を確認してください。(免責事項:質問は私によって尋ねられました。)

于 2012-04-04T14:25:35.720 に答える
2

この理由から、Class.js(https://github.com/eppz/eppz-js)と呼ばれるObjective-JavaScriptヘルパーを作成しました(追加のボイラープレートコードを適用せずに、プロトタイプの手間を削減まし

これを使用すると、次のように簡単にこの設定を行うことができます。

var BaseClass = Class.extend
({
    param1: null,
    param2: null,

    construct: function(param1, param2)
    {
        this.param1 = param1;
        this.param2 = param2;
    },
});

var SubClassA = BaseClass.extend
({
    construct: function(param1)
    {
        this.super.construct(param1, 'This is A.');
    },
});

var SubClassB = BaseClass.extend
({
    construct: function(param1)
    {
        this.super.construct(param1, 'This is B.');
    },
});

var a = new SubClassA('A stuff.');
var b = new SubClassB('B stuff.');

console.log(a.param1); // A stuff.
console.log(b.param1); // B stuff.

console.log(a.param2); // This is A.
console.log(b.param2); // This is B.
于 2014-01-13T18:02:05.037 に答える
1

私は似たようなものを持っています、そして私はこれをします:

function SubClass (param1) {
    BaseClass.call(this, param1, "I am A.");
}

BaseClassこれにより、のインスタンスオブジェクトのすべてのプロパティが得られますSubClass

編集:ここに呼び出し関数に関するいくつかの情報があります。this呼び出し中に何をするかを指定し、引数リストを提供できるので便利です。

于 2012-04-04T14:26:23.913 に答える
1

Rectangleのプロトタイプにareaメソッドを追加します。以下を満たすSquareクラスを作成します。

  1. これはRectangleのサブクラスです。
  2. コンストラクターが含まれ、他のメソッドは含まれていません。
  3. Rectangleクラスのareaメソッドを使用して、正方形の領域を印刷できます。

    class Rectangle {
    
      constructor(w, h) {
       this.w = w;
        this.h = h;
      }
    } 
    Rectangle.prototype.area = function()
    {
      var a = this.w * this.h;
      return a;
     }
     class Square extends Rectangle{
         constructor(r) {
            super(r, r)
           }
      }
    
      const rec = new Rectangle(3, 4);
      const sqr = new Square(3);
    
      console.log(rec.area());
      console.log(sqr.area());
    
于 2017-12-06T13:05:47.293 に答える
0

これは、スーパーキーワードを使用した継承の例です。

    class Animal {
  constructor(animalName, country) {
    this.animalName = animalName;
    this.country = country;
  }

  update(animalName=null, country=null) {
    if (animalName) {
      this.animalName = animalName;
    }
    if (country) {
      this.country = country;
    }
  }

  show() {
    console.log("A");
    console.log("Animal Name: ", this.animalName);
    console.log("Animal Country: ", this.country);
  }
}

animal = new Animal("Elephant", "India");
animal.show();
animal.update();
animal.show();
animal.update("Dog");
animal.show();
animal.update(null, "Africa");
animal.show();
animal.update("Whale", "Antartica");
animal.show();

class Whale extends Animal {
  constructor(name, animalName, country) {
    super(animalName, country);
    this.name = name;
  }

  updateName(name=null) {
    if (name) {
      this.name = name;
    }
  }

  show() {
    console.log("W");
    super.show();
    console.log("Penguin Name: ", this.name);
  }
}

whale = new Whale("Ele", "Whale", "Goa");
whale.show();
whale.updateName();
whale.show();
whale.updateName("Molly");
whale.show();
whale.updateName(null);
whale.show();
animal.update("Ants");
whale.show();
animal.update(null, "Australia");
whale.show();
animal.update("Mites", "New Zealand");
whale.show();

class Penguin extends Animal {
  constructor(name, animalName, country) {
    super(animalName, country);
    this.name = name;
  }

  updateName(name=null) {
    if (name) {
      this.name = name;
    }
  }

  show() {
    console.log("P");
    super.show();
    console.log("Penguin Name: ", this.name);
  }
}

penguin = new Penguin("Molly", "Penguin", "Goa");
penguin.show();
penguin.updateName();
penguin.show();
penguin.updateName("Pikachu");
penguin.show();
penguin.updateName(null);
penguin.show();
animal.update("Cat");
penguin.show();
animal.update(null, "Russia");
penguin.show();
animal.update("Seal", "Artic");
penguin.show();

ここでこのコードを試すことができます:https ://repl.it/@VinitKhandelwal/inheritance-javascript

于 2019-07-15T10:46:22.170 に答える