带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类:
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类:
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
?还是反过来?