Недавно я заметил тенденцию использования методов с префиксом подчеркивания в одном из наших проектов в Sky. Это хорошо в том смысле, что по мере того, как наше приложение растет, и количество методов, которые мы предоставляем в наших классах, растет вместе с ним, разработчики рассматривают, как выглядят общедоступные интерфейсы этих классов, и находят общий шаблон для различения частных интерфейсов. .

Однако нам удавалось скрывать частные методы и свойства в JavaScript в течение длительного времени и добавлять к этим методам знак подчеркивания, поскольку некоторые популярные библиотеки и фреймворки JS в конечном итоге заканчиваются тем, что кто-то использует их там, где они не должны.

С новым синтаксисом класса JavaScript мы получаем немного более чистый, более явный синтаксис намерений, который мы действительно смогли, и уже некоторое время встраиваем частные методы в объекты. Я знаю, что многие из приложений, которые я написал на ES5, использовали что-то вроде «выражения немедленного вызова функции» или для краткости IIFE.

Работа с ES6

Это прекрасно работает как шаблон, поскольку IIFE прекрасно инкапсулирует любой из наших методов, которые не определены в объекте Service. Мы могли бы сделать то же самое с помощью ES6, однако, если вы уже используете ES6, скорее всего, вы используете Babel для транспиляции в ES5. Мы могли бы сделать то же самое, что и выше.

В этом примере мы снова получим, что `privateMethod` не является функцией, если мы попытаемся вызвать его, однако я обнаружил, что мне нужно обернуть мой частный метод внутри объекта, иначе Babel обнаружит во время процесса транспиляции, что` this` в функции `console.log 'была undefined и изменила ее на undefined в транспилированном коде.

Работа с символами

Однако менее известным решением является использование нового объекта Symbol.

символ - это уникальный и неизменный тип данных, который может использоваться в качестве идентификатора для свойств объекта. объект символа - это неявная оболочка объекта для примитивного типа данных символа.

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

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

Поскольку символы уникальны, если мы попытаемся передать новый символ с той же строкой, мы получим ошибку, поскольку символы уникальны.

Подведение итогов

Мое предпочтительное решение для частных членов в классах JavaScript - использовать символы. Синтаксис менее подробный и понятный, чем в обоих предыдущих примерах, поскольку нам не нужно изменять лексическую область видимости с помощью метода call.

К сожалению, в Internet Explorer все еще нет поддержки символов, однако, если вы уже используете транспилятор, такой как Babel, вероятно, вы также используете CoreJS polyfill.