Подтвердить что ты не робот

Возвращает значение, отличное от класса в 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' 
  }
}
4b9b3361

Ответ 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 работает..