#javascript #function #object #ecmascript-6 #javascript-objects
#javascript #функция #объект #ecmascript-6 #javascript-объекты
Вопрос:
Я хочу ограничить доступ к определенным вещам на языке JavaScript извне. Я провел некоторое исследование по этому вопросу, но я не смог получить все, что хотел. Я знаю, что подчеркивание не обеспечивает полной защиты.Когда я пытаюсь достичь извне, я могу легко достичь. Я собираюсь написать пример кода.
function Car(){
this._mileage = 0;
}
Car.prototype.drive = function(miles){
if(typeof miles == 'number' amp;amp; miles > 0){
this._mileage = miles;
}else{
throw new Error("Sadece pozitif sayılar girin");
}
};
Car.prototype.readMileage = function(){
return this._mileage;
}
var hondo = new Car();
console.log('old: ' hondo._mileage);
hondo._mileage = 100;
console.log('new: ' hondo._mileage);
Как вы можете видеть: хотя я использовал символы подчеркивания, я мог легко получить доступ из-за пределов класса.
Другой метод
Я нашел метод в своих исследованиях. Но я тоже не совсем понимаю это.
var Car = (function(){
var _ = PrivateParts.createKey(); // createKey = ?
function Car(mileage){
_(this).mileage = mileage;
}
Car.prototype.drive = function(miles){
if( typeof miles == 'number' amp;amp; miles > 0){
_(this).mileage = miles;
}else{
throw new Error('drive only accepts positive numbers');
}
}
Car.prototype.readMileage = function(){
return _(this).mileage;
}
return Car;
}());
Комментарии:
1. Что вы подразумеваете под » извне языка javascript «?
2. Какие » определенные вещи » вы хотите защитить и от кого?
3. Я хочу запретить пользователю доступ к некоторому коду. Например; Рассмотрим код, который предотвращает падение скорости ниже 0. Позвольте пользователю вводить только значение скорости. Просто достигните этого значения. Кроме этого, невозможно изменить что-либо еще внутри класса.(пример)
4. Что вы подразумеваете под «пользователем»? Конечный пользователь, выполняющий код? Конечный пользователь просматривает веб-страницу? Программист, использующий ваш код? Программа, использующая ваш объект? Обратите внимание, что любой из них может изменить ваш объект, чтобы делать все, что захочет, вы не можете его контролировать.
Ответ №1:
Ваш второй код, как правило, на правильном пути, хотя сначала вам нужно 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' amp;amp; 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
замыкания, это эффективный способ убедиться, что информация не доступна извне.
Тем не менее, это не мешает клиентам просматривать ваш исходный код — ни один клиентский код не является действительно закрытым. Если у вас есть конфиденциальная информация, вы должны отправлять ее клиенту только в том случае, если он должен ее знать. Использование подобной техники не помешает клиенту просмотреть ваш код и, возможно, перехватить отправленную информацию. (Гнусные скрипты могут делать нечто подобное, особенно если им предоставлена возможность запуска до запуска вашего скрипта.) Итак, то, что это реализует, не столько конфиденциально, сколько обеспечивает разумные, но не жесткие ограничения на то, как другие хорошо управляемые скрипты могут получать доступ к данным.
Ответ №2:
Это называется IIFE (выражение функции, вызываемое немедленно), и это означает, что закрытый ключ, который вы создаете с PrivateParts.createKey
помощью, никогда не будет доступен за пределами функции, потому что код внутри IIFE выполняется, а затем завершается. Из-за того, как вы его определили, теперь у вас есть полностью уникальный ключ, к которому нельзя получить доступ из любого места. При этом по-прежнему очень небезопасно выполнять какие-либо операции с ключами или шифрованием на стороне клиента — используйте PHP, Node.JS или другой серверный язык для полной защиты ваших данных.