JS ECMAScript 6中是否继承构造函数?

4

I have example class:

class Something{
    constructor(x, y){
       this.x = x;
       this.y = y;
    }

    //...
}

如果我创建一个类继承于这个类:

class Dog extends Something{
    constructor(name){
       this.name = name;
    }

    //...
}

Dog的构造函数会长成这样吗?

constructor(x, y, name){
   this.x = x;
   this.y = y;
   this.name = name;
}

如果不行的话,能否使它像这样^一样工作?

你需要在Dog的构造函数中使用 super(x, y); 显式地创建它。 - Andrey
你试过这段代码吗?它会抛出异常,因为你漏掉了 super - loganfsmyth
3个回答

8
在JS ECMAScript 6中,构造函数并没有被继承。但是,如果您根本不提供构造函数,则JavaScript引擎会提供一个默认值,类似于继承的构造函数。1(和您的示例无关,您在Dog中提供了一个构造函数。)
因为您在Dog中定义了构造函数,所以JavaScript引擎不会为您做任何事情;你需要定义Dog的构造函数,并通过super调用Something的构造函数(在调用super之前不能使用this)。
您的Dog构造函数需要接受xy,或者硬编码它自己的xy值(或从它接收到的参数中推导出它们):
class Dog extends Something{
    constructor(name, x, y) {
       super(x, y);
       this.name = name;
    }

    //...
}

硬编码:

// Accepting them:
class Dog extends Something{
    constructor(name) {
       super(42, 57);
       this.name = name;
    }

    //...
}

(或者当然,仅接受 xy ,并硬编码/推导出另一个。)

1 如果您完全没有提供constructor,JavaScript引擎会自动为您添加一个构造函数

对于基类,它看起来像这样:

constructor() {
}

对于派生类,它看起来像这样:
constructor(...args) {
    super(...args);
}

我之所以说它有点像继承构造函数,是因为与 Java 或 C# 等语言不同,它们的默认构造函数不接受参数并调用没有参数的 super,JavaScript 的默认构造函数会传递所有接收到的参数。


谢谢,这很有帮助,现在我明白了。当我能够做到时,我会接受您的答案作为有帮助的(大约10分钟)。 - Brunon Blok

1

您应该明确调用基类构造函数,使用

super(x, y);

为了获得所需的行为。

0

它确实支持ECMAScript 2015:

class Animal {
  constructor() {
    console.log("Hello");
  }
}

class Dog extends Animal {}

var d = new Dog(); // Prints "Hello"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接