Конфиденциальность в JavaScript
Функция scoping предлагает единственную конфиденциальность в JavaScript.
Итак, каноническое:
function Ctor(dep1, dep2) {
this._dep1 = dep1;
this._dep2 = dep2;
}
Ctor.prototype.foo = function() {
// use this._dep1/2...
}
... проблематично в том, что он не предлагает инкапсуляцию для введенных зависимостей.
Альтернатива (хотя и немного другая с точки зрения расположения foo
) который предлагает реальную инкапсуляцию может быть:
function factory(dep1, dep2) {
return {
foo: partial(foo, dep1, dep2), // or use bind (partial could be a library fn for partial application)
};
}
function foo(dep1, dep2) {
// use dep1/2
}
Но я редко вижу эту картину. Есть ли веская причина не использовать последнее?
2 ответа
Вы уже заявляете о преимуществах второго паттерна. Недостатки:
Вы должны либо сгруппировать методы по видимости (даже если закрытый метод тесно связан с общедоступным, но едва ли связан с другими частными методами), либо повторить все открытые методы в литерале объекта (который плохо работает с jsdoc).
код вводит отдельный функциональный объект для каждого экземпляра вашего класса, который жертвует некоторой производительностью (это обычно не имеет значения, но иногда может)
в отличие от частных модификаторов во многих языках программирования, эта инкапсуляция не может быть обойдена, даже если ее неправильно использовать, и я действительно знаю, что я делаю (исторически JavaScript был средой, в которой что-то происходит, и многие связывают его успех с этой расширяемостью)
Просто: почему?
"Конфиденциальность" ужасно переоценена. Это ничего не скрывает от тех, кто действительно этого хочет. Наличие "защищенных" или "закрытых" членов исключительно для пользы программиста, в частности, для указания того, как должен использоваться конкретный член (здесь это публичный API, здесь это не так, пожалуйста, не трогайте его, если вы не знаете что оно делает). Это все. Соглашения об именах, такие как начальные подчеркивания, вполне достаточно для реализации этого. Если имя участника начинается с подчеркивания, не трогайте его, если вы не знаете, что делаете.
Там нет внутренней необходимости наклоняться назад дальше, чем это.