Ваш второй код, как правило, находится на правильном пути, хотя сначала вам нужно определить privateParts
. Это также кажется слишком сложным в данный момент.
Идея состоит в том, чтобы сохранить переменную в закрытии; из-за обычных правил видимости переменная не может быть доступна вне того места, где она определена:
const fn = (() => {
const foo = 'foo';
return () => 'foo is: ' + foo;
})();
// at this point, the contents of the "foo" variable are not visible to the outside,
// you can only call the deliberately exposed function:
console.log(fn());
Аналогично, с классом вы можете сохранить все свойства, которые вы хотите сохранить приватными, в карте, проиндексированной используемым экземпляром: оставьте для карты значение только класс , а не внешний, и все вы положили на карту не будет виден снаружи:
const Car = (() => {
const map = new WeakMap();
return class Car {
constructor(mileage) {
map.set(this, { mileage });
}
drive(miles) {
if (typeof miles == 'number' && miles > 0) {
map.get(this).mileage += miles;
} else {
throw new Error('drive only accepts positive numbers');
}
}
readMileage() {
return map.get(this).mileage;
}
}
})();
var hondo = new Car(50);
console.log('old: '+hondo._mileage);
hondo._mileage = 100;
console.log('new: '+hondo._mileage);
console.log(hondo.readMileage());
hondo.drive(100);
console.log('newer: '+hondo._mileage);
console.log(hondo.readMileage());
Карта - это просто объект, проиндексированный каждым this
(каждый экземпляр Car
). Поскольку его значения могут быть получены только внутри замыкания Car
, это эффективный способ убедиться, что информация не подвергается воздействию извне.
Тем не менее, это не мешает клиентам просматривать ваш исходный код - никакой клиентский код не является действительно закрытым. Если у вас есть конфиденциальная информация, вы должны отправлять ее клиенту только в том случае, если у него есть , чтобы ее узнать. Использование такой техники не помешает клиенту взглянуть на ваш код и, возможно, перехватить отправленную информацию. (Нечестивые сценарии могут делать что-то подобное, особенно если им предоставляется возможность запускаться до запуска сценария.) Так что это реализует не столько конфиденциально , сколько столько, сколько разумно но не герметичные ограничения на то, как другие скрипты с хорошим поведением могут получать доступ к данным.