Возвращает значение, отличное от класса в ES6
Недавно я тестировал классы с ES6, я заметил, что при создании класса вы не можете указать значение, заданное конструктором.
Ранее в ES5 это было возможно.
В обоих случаях я создавал экземпляр класса с new MyClass
Причина, по которой я хочу сделать это, я могу вернуть подмножество текущего класса с только функциями на нем.
ES5 - возвращает My class was init with: Blah
var MyClass = function() {
this.initVar = 'Blah'
return 'My Class was init with: ' + this.initVar
}
ES6 - возвращает {}
class Bob {
constructor() {
return 'hello'
}
}
Ответы
Ответ 1
В соответствии с статьей класса с веб-сайта TC39 синтаксис класса ES6 имеет неявную функцию-конструктор, которая вызывается, если такая функция отсутствует приведенные в определении класса.
Это можно переопределить, предоставив свой собственный конструктор и вернув любой желаемый объект, например:
class Bob {
constructor(name) {
return {hi: name}; // returns an object other than *this*.
}
}
В действии:
var bob = new Bob('bob');
console.log(bob.hi); // 'bob'
Чтобы расширить класс, вы можете сделать:
class Bill extends Bob {
}
Однако extends также имеет неявный конструктор, поэтому он вернет новый экземпляр Билла, который наследуется от Bob.prototype. Поскольку hi определено в конструкторе и не унаследовано, вы получаете:
var bill = new Bill('bill');
console.log(bill.hi); // undefined
Чтобы инициализировать Bill так же, как Bob, укажите конструктор, который вызывает super. Этот вызов также изменяет этот объект Билла на значение, возвращаемое супер, например.
class Bill extends Bob {
constructor(name) {
super(name);
}
}
Теперь:
var bill = new Bill('bill');
console.log(bill.hi); // bill
Также стоит отметить, что тело классаDeclaration всегда строгий код режима.
В качестве исполняемого фрагмента:
class Bob {
constructor(name) {
return {hi: name}; // returns an object other than *this*.
}
}
var bob = new Bob('bob');
console.log(bob.hi); // 'bob'
class Bill extends Bob {
constructor(name) {
super(name);
}
}
var bill = new Bill('bill');
console.log(bill.hi); // bill
Ответ 2
Сравните эти скрипты: es5 и
es6
То, что вы сказали, возможно в es5, по-прежнему возможно в es6, есть небольшая вещь, что если вы используете новое ключевое слово, то создается новый объект для этого класса, и если вы не используете его, функция будет выполнена.
-
Итак, когда вы говорите var x= Bob();
как в es5, так и в es6, вы выполняете функцию конструктора, а не создаете новый объект, поэтому он возвращает что-то.
-
И когда вы говорите var x= new Bob();
, вы получаете новый объект, инициализированный функцией конструктора.
Это применимо как к es5, так и к es6, поскольку классы es6 ничего не делают, но вводятся только для синтаксиса.
Изменить. В случае расширения классов:
Вы не можете просто расширить класс в es6 и ожидать, что супер конструктор вызывается, вам нужно явно его вызвать внутри конструктора дочернего класса.. см. Код:
class Bob {
constructor() {
return {hi: 'bob'}
}
}
class Bill extends Bob {
constructor() {
return super();// here you should retun the called super constructer
}
}
var x= Bob();
console.log(Bob);
x= new Bill();
console.log(x.hi);
Вот почему этот не работает, но this работает..