Для многих разработчиков, особенно для тех, кто работает с традиционными языками, такими как 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 с классом языка ООП похоже на сравнение яблока с апельсином.