Сбивающий с толку пример рядового В.С. Публичный метод в книге «Шаблоны Javascript»?

Недавно я читал шаблоны Javascript Стефанова. И я нашел этот пример запутанным для меня здесь:

Другим случаем использования соглашения для имитации функциональности является соглашение о закрытых членах. Хотя вы можете реализовать настоящую конфиденциальность в JavaScript, иногда разработчикам проще просто использовать префикс подчеркивания для обозначения частного метода или свойства. Рассмотрим следующий пример:

вар человек = {

получитьИмя: функция () {

вернуть this._getFirst() + ' ' + this._getLast(); },

_getFirst: функция () {

// ... },

_getLast: функция () {

// ... }

};

В этом примере getName() должен быть общедоступным методом, частью стабильного API,

тогда как _getFirst() и _getLast() должны быть закрытыми.

Насколько я понимаю, либо метод приватный, либо публичный определяется тем, как он был написан. Например, если мы говорим о функции-конструкторе, то this.getFirst() = function(){ ... } будет общедоступным методом, тогда как var getFirst=function(){...} будет частным.

Пример в книге не является функцией-конструктором. И я верю, что нельзя просто использовать подчеркивание, чтобы сделать метод общедоступным или закрытым. Как же тогда сделать частный или публичный метод в объекте, объявленном так, как в примере выше?

Большое спасибо!


person Eli Zhang    schedule 08.09.2016    source источник


Ответы (2)


Javascript не имеет действительно закрытых переменных/методов. Шаблон (подчеркивание) — это просто соглашение о кодировании. См. MDN: частные свойства. Он читает

Приведенный выше прием (подчеркивание) прост и четко выражает намерение. Однако использование префикса подчеркивания является просто соглашением о кодировании и не применяется языком: ничто не мешает пользователю напрямую обращаться к свойству, которое должно быть закрытым.

Между тем, вы не можете использовать var getFirst=function(){...} внутри конструкции Object literal {...}.

person Alex Kudryashev    schedule 08.09.2016
comment
Спасибо за ваш ответ Алекс. Это проясняет мое замешательство. - person Eli Zhang; 09.09.2016

Похоже, он пытается сказать, что getName(); является методом доступа в том же классе, что и функции-члены закрытых данных.

person user3128436    schedule 08.09.2016
comment
Функция доступа создается для доступа к закрытым членам без изменения/изменения значений. - person user3128436; 08.09.2016