То, что вы хотите, на самом деле не может быть сделано.Вы МОЖЕТЕ создать прокси, чтобы перехватывать вызовы извлечения / манипуляции, но вы не можете сделать основной объект закрытым.
Например, если у вас есть объект
const privateObj = { name: 'John Smith', ssn: '123-45-6789' };
и прокси
const proxy = new Proxy(privateObj, {} /* handler for getter/setter traps */);
вы можете консоль войти в прокси, чтобы получить что-то вроде этого:
[[Handler]]: Object
[[Target]]: Object
[[IsRevoked]]: false
, и вы можете развернуть [[Target]]
, чтобы увидеть свойства базового объекта.Поэтому, если вы хотите, чтобы это свойство было полностью приватным, вы не захотите использовать прокси.Кроме того, если пользователь может проверить прокси, он может легко получить доступ к базовому объекту и изменить его вне ловушек прокси.
Если вы хотите иметь возможность действительно защитить этот объект, было бы лучшечтобы защитить его в закрытии функции и иметь обертки getter / setter вокруг этого объекта.
Вы можете попробовать в качестве первого шага:
const protectObject = (SessionKey, ...objectProps) => {
const protectedObject = { // Do something here to create the object
...objectProps // and its properties you want to protect
};
return {
accessProp(_SessionKey, prop) {
if (_SessionKey !== SessionKey) throw Error("Your session key doesn't match");
return protectedObject[prop];
},
setProp(_SessionKey, prop, val) {
if (_SessionKey !== SessionKey) throw Error("Your session key doesn't match");
protectedObject[prop] = val;
}
};
};
Так что теперь у вас есть закрытый объект, который защищен:
const privateObj = protectObject('12345', 'John Smith', '7/20/1992', '123-45-6789');
privateObj.accessProp('12345', 1); // '7/20/1992'
privateObj.accessProp('1234', 2); // Uncaught Error: Your session key doesn't match
privateObj.setProp('12345', 1, '7/21/1993');
privateObj.accessProp('12345', 1); // '7/21/1993'