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"