JavaScript - это язык, основанный на прототипах, и с помощью прототипов можно добиться объектно-ориентированного поведения.

Так как же язык, основанный на прототипах, создает класс и экземпляр?

Как и языки на основе классов, языки на основе прототипов не создают класс и экземпляр, а вместо этого создают прототипный объект (объект используется как шаблон для нового объекта).

Если это так, то как мы реализуем поведение класса в javascript?

Мы можем реализовать поведение класса в JavaScript, используя объекты. JavaScript позволяет создавать объект несколькими способами. Некоторые из них перечислены ниже.

  • Использование конструктора объектов - new Object()
  • Использование Object.create - Object.create(null)
  • Использование пары скобок - {}
  • Использование функций-конструкторов - function(){}

Наиболее часто используемый способ создания объекта (для реализации поведения класса) - использование функций конструктора.

Давайте реализуем класс сотрудников с частными и общедоступными методами, как показано на рисунке ниже.

Мы можем реализовать приведенную выше диаграмму классов в JavaScript, используя функцию-конструктор, как показано в приведенном ниже фрагменте кода.

В ES6 вышеупомянутый класс может быть реализован с использованием синтаксиса класса (который является всего лишь синтаксическим сахаром прототипов).

Мы можем легко преобразовать приведенный выше код в ES6, но есть проблема. Мы не можем объявлять переменные внутри класса в ES6, поэтому нам нужно сопоставить частные переменные (немногие предлагают использовать префикс _, чтобы отличать частные функции / переменные от общедоступных ) в этот контекст, который предоставит эти переменные внешнему миру, сделав их общедоступными.

Если вы видите строки 35 и 36 в приведенном выше коде, он печатает значения переменных, которые должны быть частными.

Так как же это исправить?

Предлагая частные методы stage-3, мы можем добиться реального поведения частных полей / методов, просто добавив к переменным хэштег (#).

Да, вы не ослышались. Его #. Почему хэштег (#)?

В приведенном выше коде строки 33 и 34 вызывают синтаксическую ошибку при попытке доступа к ним. Таким образом, частные методы и поля теперь могут быть реализованы в JavaScript без каких-либо проблем.

Предложение частного метода находится на этапе 3, и то же самое можно реализовать с помощью плагина @ babel / plugin-scheme-private-methods.

В приведенном выше фрагменте кода мы использовали частные переменные в качестве свойств класса. То же самое можно реализовать с помощью плагина @ babel / plugin-scheme-class-properties.

ПРИМЕЧАНИЕ. Частные поля и методы можно использовать только путем предварительного объявления переменных или методов. Их нельзя создать во время выполнения путем присвоения ссылки на объект. (т.е.) Приведенный выше фрагмент кода выдаст ошибку, если частные переменные не объявлены и не присвоены значения внутри общедоступного метода, как показано ниже.

Частные поля и методы будут работать только с синтаксисом класса es6, и если вы реализуете свой класс с помощью литерала объекта или другими способами, вы не сможете добиться такого поведения.