Skip to content

Instantly share code, notes, and snippets.

@DadgadCafe
Last active March 29, 2017 15:14
Show Gist options
  • Save DadgadCafe/2324c3fbf57daaf845d69425b056567b to your computer and use it in GitHub Desktop.
Save DadgadCafe/2324c3fbf57daaf845d69425b056567b to your computer and use it in GitHub Desktop.
implement private Object props, using Proxy.
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