2016-12-06 22 views
3

我的示例类:是在JS ECMAScript 6中继承的构造函数吗?

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

    //... 
} 

当我会让继承类是这样的:

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

    //... 
} 

威尔狗的构造这个样子的?

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

如果没有,是否可以使它像这样工作^?

+0

您需要创建它明确使用'super'犬的构造像'超(X,Y);' – Andrey

+0

你试试这个代码?它会抛出一个异常,因为你遗漏了'super'。 – loganfsmyth

回答

7

是在JS ECMAScript 6中继承的构造函数吗?

不是,没有。但是如果你根本没有提供构造函数,那么JavaScript引擎提供的默认行为就像继承的构造函数。 (您的例子不相关,您所提供的Dog构造函数)。

威尔狗的类这个样子的?

不是。因为您已在Dog中定义构造函数,所以JavaScript引擎不会为您执行任何操作;您可以定义Dog的构造函数,并通过super调用Something的位置(并且在调用super之前不能使用this)。

Dog构造需要或者接受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和硬编码/导出另外一个。)


如果你不提供constructor可言,JavaScript引擎adds one for you

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

constructor() { 
} 

派生类,它看起来像这样:

constructor(...args) { 
    super(...args); 
} 

那后者就是为什么我说这是一个有点像具有继承因为不像Java或C#这样的默认构造函数不接受任何参数并且调用super而没有参数的语言,JavaScript默认传递它接收的所有参数。

+0

谢谢,这是有帮助的,现在我明白了。当我能够做到时(约10分钟),我会接受你的回答, –

1

你应该叫明确使用

super(x, y); 

基类的构造函数,以获得所需的行为。

0

确实如此,2015年的ECMAScript:

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

class Dog extends Animal {} 

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