Last active
March 29, 2017 15:14
-
-
Save DadgadCafe/2324c3fbf57daaf845d69425b056567b to your computer and use it in GitHub Desktop.
implement private Object props, using Proxy.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function proxied (obj) { | |
const o = Object.assign({}, obj) | |
function filterPrivate (key) { | |
if (key[0] === '_') { | |
throw Error('cannot access private key: ${key}') | |
} | |
} | |
const handler = { | |
get (target, key, receiver) { | |
filterPrivate(key) | |
const result = Reflect.get(target, key, receiver) | |
if (isFunction(result)) { | |
return result.bind(target) | |
} | |
if (isObject(result)) { | |
return new Proxy(result, handler) | |
} | |
return result | |
}, | |
set (target, key, value, receiver){ | |
filterPrivate(key) | |
return Reflect.set(target, key, value, receiver) | |
}, | |
deleteProperty (target, key) { | |
filterPrivate(key) | |
return Reflect.deleteProperty(target, key) | |
}, | |
defineProperty (target, key, descriptor) { | |
filterPrivate(key) | |
return Reflect.defineProperty(target, key, descriptor) | |
}, | |
has (target, key) { | |
if (key[0] === '_') { | |
return false | |
} | |
return Reflect.has(target, key) | |
}, | |
ownKeys (target) { | |
return Reflect.ownKeys(target).filter(key => key[0] !== '_') | |
}, | |
getOwnPropertyDescriptor (target, key) { | |
filterPrivate(key) | |
return Reflect.getOwnPropertyDescriptor(target, key) | |
} | |
} | |
return new Proxy(o, handler) | |
} | |
function isObject (obj) { | |
return obj && typeof obj === 'object' | |
} | |
function isFunction (obj) { | |
return typeof obj === 'function' | |
} | |
// ---------- example --------- | |
const obj = { | |
o: { | |
_v: 2, | |
f () { | |
console.log(this._v) | |
} | |
}, | |
f () { | |
console.log(this._v) | |
}, | |
_v: 1 | |
} | |
const proxiedO = proxied(obj) | |
proxiedO.f() // 1 | |
proxiedO.o.f() // 2 | |
proxiedO._v // error | |
proxiedO.o._v // error |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment