Для многих разработчиков, особенно для тех, кто работает с традиционными языками, такими как Java, C#, PHP и т. д., и для тех, кто страстно увлечен парадигмой ООП, ES6 может стать огромной победой, поскольку самая востребованная функция в Javascript наконец-то вышла: класс. Но есть ли только розы?

Старое вино в новой бутылке

Мы объявляем класс в ES6, как показано ниже:

Когда мы проверяем тип A

typeof A

Он распечатает function. Если мы введем приведенный выше код в консоли Chrome, он напечатает

function class A {
}

A — это просто особая функция, которую нельзя вызвать (до этого момента). Попытка вызвать A() вызовет ReferenceError:

Uncaught ReferenceError: A is not defined

Судя по всему, с ES6 не поставляется ничего нового.

Просто удобный синтаксис

Давайте посмотрим, что будет делать механизм Javascript при работе с классом.

Ниже показано, что увидит движок javascript:

Судя по всему, ничего нового в ES6 class.

Это просто синтаксический сахар поверх наследования прототипов.

Яблоко против апельсина

Давайте посмотрим, в чем разница между классом ES6 и языковым классом ООП.

Концепция

В традиционных языках ООП класс представляет собой чертеж/шаблон, из которого создаются экземпляры.

В Javascript класс — это просто функция конструктор.

Поведение

В традиционных языках при создании экземпляров методы, свойства и т. д. копируются из родительских классов в дочерние классы, а затем из класса в новые экземпляры.

В то время как в Javascript такой копии нет из классов в классы и из классов в экземпляры. Есть только ссылки между объектами.

Функции

class лежит в основе языков ООП. Неудивительно, что языки ООП поддерживают множество функций, таких как: области видимости переменных класса, множественное наследование, статический блок, вложенный класс...

В Javascript класс — это просто синтаксический сахар поверх наследования прототипов. Поддержка функций в классе ограничена. В настоящее время поддерживаются только следующие:

  • конструктор
  • метод экземпляра
  • статический метод

Обратите внимание, что свойство класса не поддерживается.

Таким образом, сравнение класса Javascript с классом языка ООП похоже на сравнение яблока с апельсином.