带super()调用的Javascript继承

带super()调用的Javascript继承,javascript,inheritance,Javascript,Inheritance,我有一些伪类,它们共享大部分初始化。我决定进行初始化并创建一个基类,它们将从中继承 function BaseClass(param1, param2) { ... } function SubClassA(param1) { ... } function SubClassB(param1) { ... } 我希望子类1和子类2以以下方式继承基类: subassa(param1)constructor调用BaseClass(param1,“我是A.”) 子类B(pa

我有一些伪类,它们共享大部分初始化。我决定进行初始化并创建一个基类,它们将从中继承

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

function SubClassA(param1) {
    ...
}

function SubClassB(param1) {
    ...
}
我希望
子类1
子类2
以以下方式继承
基类

subassa(param1)
constructor调用
BaseClass(param1,“我是A.”)

子类B(param1)
构造函数调用
基类(param1,“我是B.”

所以
BaseClass
为它们添加了一些属性。然后,这两个子类各自进行初始化

现在我不能只做
subassa.prototype=new BaseClass()
,因为我希望超级构造函数接受参数。如何优雅地做到这一点

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

function SubClassB(param1) {
    BaseClass.call(this, param1, "I Am B.");
}
执行
新建子类(param1)
新建子类b(param1)
时,将使用适当的参数调用基本构造函数

此外,除了定义基类之外,还有其他方法。你们可以查看这个问题的一些细节。(免责声明:该问题由我提出。)

执行
新建子类(param1)
新建子类b(param1)
时,将使用适当的参数调用基本构造函数


此外,除了定义基类之外,还有其他方法。你们可以查看这个问题的一些细节。(免责声明:这个问题是我提出的。)

我有类似的问题,我这样做:

function SubClass (param1) {
    BaseClass.call(this, param1, "I am A.");
}
这为我提供了
子类
的实例对象上的
基类
的所有属性


编辑:这里有一些关于的信息。它很有用,因为您可以在调用过程中指定此是什么,并提供参数列表。

我有一些类似的东西,我这样做:

function SubClass (param1) {
    BaseClass.call(this, param1, "I am A.");
}
这为我提供了
子类
的实例对象上的
基类
的所有属性


编辑:这里有一些关于的信息。它很有用,因为您可以在调用过程中指定此是什么,并提供一个参数列表。

为此,我制作了一个名为--soley的客观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.

出于这个原因,我制作了一个名为--soley的客观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.

向Rectangle的原型添加area方法。创建满足以下条件的Square类:

  • 它是矩形的一个子类
  • 它包含构造函数,不包含其他方法
  • 它可以使用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());
    

  • 向Rectangle的原型添加area方法。创建满足以下条件的Square类:

  • 它是矩形的一个子类
  • 它包含构造函数,不包含其他方法
  • 它可以使用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());
    

  • 下面是一个带有super关键字的继承示例

        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();
    

    您可以在这里尝试以下代码:

    这里是一个使用super关键字的继承示例

        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();
    

    您可以在这里尝试以下代码:

    啊,我没有想到call()。好的,谢谢;)@kiswa,如果你不介意的话,我会接受taskinoor,因为他是第一张海报:)对我来说很公平。但请随意向上投票!;)此外,如果您感兴趣,我还添加了一个指向MDN的链接,以了解更多详细信息。
    param
    是否意味着
    param1
    ?或者反过来呢?啊,我没有想到call()。好的,谢谢;)@kiswa,如果你不介意的话,我会接受taskinoor,因为他是第一张海报:)对我来说很公平。但请随意向上投票!;)此外,如果您感兴趣,我还添加了一个指向MDN的链接,以了解更多详细信息。
    param
    是否意味着
    param1
    ?还是反过来?