ES6 классы обязательно нужно вызывать с ключевым словом new — без него выбросится TypeError. Традиционные функции-конструкторы можно вызывать без new в нестрогом режиме, что молча загрязнит глобальную область видимости вместо создания нового экземпляра.
Методы, определённые в теле class, по умолчанию неперечислимые, то есть они не появятся в циклах for...in. Методы функций-конструкторов, прикреплённые к prototype, перечислимы, если не настроены иначе явно с помощью Object.defineProperty.
Функции-конструкторы полностью поднимаются и могут быть вызваны до их объявления. Классы не поднимаются таким же образом — они находятся в Temporal Dead Zone (TDZ) с начала блока до момента вычисления объявления, вызывая ReferenceError при обращении раньше времени.
Тело класса всегда исполняется в strict mode автоматически. Функции-конструкторы работают в strict mode только если 'use strict' объявлено явно.
Классы предоставляют чистый синтаксис наследования с использованием extends и super:
class Animal {
constructor(name) { this.name = name; }
}
class Dog extends Animal {
speak() { return `${this.name} barks`; }
}
С функциями-конструкторами наследование требует ручной настройки цепочки prototype:
function Animal(name) { this.name = name; }
function Dog(name) { Animal.call(this, name); }
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
new)ES6 классы и функции-конструкторы оба позволяют вызываться без ключевого слова new в non-strict режиме, хотя классы создадут экземпляр, а функции-конструкторы загрязнят глобальную область видимости.
Новый — ещё не проверен сообществом
Вы