//目标对象
let p = {
name: "令狐狐冲",
age: 18,
__skill__: "独孤九剑"
}
//创建代理对象
let proxy = new Proxy(p, {
//对姓名做屏蔽操作 令狐狐冲=>令**冲
//拦截对象属性的读取操作
get(target, key) {
if (key === "name") {
var name = target[key]
var array = name.split("")
//"**"
var replaceStr = "*".repeat(name.length - 2 < 0 ? 0 : name.length - 2)
//数组元素的替换 **=>*,*
array.splice(1, array.length - 2, ...replaceStr)
return array.join("")
}
},
//拦截对象属性的赋值操作
set(target, key, value) {
if (key[0] === "_") {
throw new Error(`设置"${key}"属性无效`)
}
target[key] = value
return true
},
//拦截判断对象是否具有某个属性 in
has(target, key) {
if (key[0] === "_") {
return false
}
return key in target
},
//拦截delete操作
deleteProperty(target, key) {
if (key[0] === "_") {
delete target[key]
return true
} else {
return false
}
},
//拦截对象自身属性的读取操作。
//for...in、object.keys()、object.getOwnPropertySymbols()..
ownKeys(target) {
return Object.keys(target).filter(key => key[0] !== "_")
}
})
//直接读取目标对象的属性
console.log(p.name)
//通过代理对象读取目标对象的属性,增加的名称信息屏蔽的操作
console.log(proxy.name)
// p.__skill__="华山剑法"
// console.log(p)
proxy.age = 28
console.log("proxy", proxy)
// proxy.__skill__ = "华山剑法"
// console.log("proxy", proxy)
console.log("__skill__" in p)
console.log("__skill__" in proxy)
for (let key in proxy) {
console.log(key)
}
// delete proxy.__skill__
// console.log("proxy", proxy)
// delete proxy.name
// console.log("proxy", proxy)