2016-12-06 2 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' в конструкторе Собачьего как' супер (х, у); ' – Andrey

+0

Пробовали ли вы этот код? Это вызовет исключение, потому что вы оставили «супер». – loganfsmyth

ответ

7

Является ли конструктор унаследованным в JS ECMAScript 6?

Не совсем, нет. Но если вы не предоставляете конструктор вообще, механизм JavaScript предоставляет по умолчанию, который действует как унаследованный конструктор. (Не применимо к вашему примеру, вы предоставили конструктор в Dog.)

Уилла собаки класса выглядят как это?

Нет. Поскольку вы определили конструктор в Dog, механизм JavaScript ничего не сделает для вас; вам нужно определить конструктор Dog и позвонить ему Something через super (и вы не можете использовать this, пока не позвоните super).

Ваш Dog конструктор должен был бы либо принять x и y, или жёстко свои собственные (или вывести их из аргумента он получить):

Принимая их:

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; 
    } 

    //... 
} 

(или, конечно, принимаем только x или y и жёстко/вывести другой.)


Если вы не предоставите constructor вообще, двигатель JavaScript adds one for you.

Для базовых классов, это выглядит следующим образом:

constructor() { 
} 

Для производных классов, это выглядит следующим образом:

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

Это последний один почему я говорю, что это немного похоже на унаследованное конструктор, потому что в отличие от языков, таких как Java или C#, где конструктор по умолчанию не принимает аргументов и вызывает super без аргументов, по умолчанию JavaScript по всем его аргументам.

+0

Спасибо, это полезно, теперь я это понимаю. Я приму ваш ответ как полезный, когда смогу это сделать (~ 10 минут) –

1

Вы должны вызвать конструктор базового класса явно с помощью

super(x, y); 

для того, чтобы получить желаемое поведение.

0

Это делает, ECMAScript 2015:

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

class Dog extends Animal {} 

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