JSFiddle - React, Tailwind, and code Playground
Proxy: hide props
by Csaba Hellinger
JavaScript
function privateProps(obj, filterFunc) {
const handler = {
get (obj, prop) {
return filterFunc(prop) ? undefined : Reflect.get(obj, prop);
},
set (obj, prop, valiue) {
if (filterFunc(prop)) {
throw new TypeError(`Can't set property "${prop}"`);
}
return Reflect.set(obj, prop, value);
},
has (obj, prop) {
return filterFunc(prop) ? false : Reflect.has(obj, prop);
},
ownKeys (obj) {
return Reflect.ownKeys(obj).filter(prop => !filterFunc(prop));
},
getOwnPropertyDescriptor (obj, prop) {
return filterFunc(prop) ? undefined : Reflect.getOwnPropertyDescriptor(obj, prop);
}
};
return new Proxy(obj, handler);
}
const myObj = privateProps({ _private: 'secret', public: 'hello' }, prop => prop.indexOf('_') === 0);
console.clear();
console.log(myObj); // chrome somehow logs the private prop
console.log(JSON.stringify(myObj)); // {"public":"hello"}
console.log(myObj._private); // undefined
console.log('_private' in myObj); // false
console.log(Object.keys(myObj)); // ['public']
for (let prop in myObj) { console.log(prop); } // public
myObj._private = 'chicken attack'; // TypeError: Can't set property "_private"