Proxy method vs private

Methods can access proxy-private properties

by Csaba Hellinger

JavaScript

// original code from the post
function privateProps(obj, filterFunc) {
    const handler = {
        get (obj, prop) {
        	if (!filterFunc(prop)) {
            	let value = Reflect.get(obj, prop);
                // little modification here, to auto-bind the methods to the original object, 
                // so they will have full access to it via 'this'.
                if (typeof value === 'function') {
                	value = value.bind(obj);
                }
            	return value;
            }
        },
        set (obj, prop, value) {
            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);
}

// your code
var obj = privateProps({ 
	_private: 'secret', 
    public: 'hello', 
    foo: function() { 
    	console.log('the method can access it:', this._private); 
    }
}, prop => prop.indexOf('_') === 0);

// tests
obj.foo();
console.log('the outside world can\'t:', obj._private);