//ES5
let obj = {}
let newVal = ""
Object.defineProperty(obj, "name", {
get() {
return newVal
},
set(val) {
newVal = val
}
})
obj.name = "Yan"
console.log(obj.name)
let p = new Proxy(obj, {})
p.name = "Yang"
console.log(p.name)
// get 设置
let arr = [7, 8, 9]
arr = new Proxy(arr, {
get(target, p) {
return p in target ? target[p] : "error"
}
})
console.log(arr[0]) // 7
console.log(arr[10]) // error
let dict = {
"hello" : "你好",
"world" : "世界"
}
dict = new Proxy(dict, {
get(target, p) {
return p in target ? target[p] : p
}
})
console.log(dict["hello"])
// set
let arr1 = []
arr1 = new Proxy(arr1, {
set(target, prop, val) {
if(typeof val == "number") {
target[prop] = val
return true
}else {
return false
}
}
})
arr1.push(5)
arr1.push(6)
console.log(arr1)
console.log(arr1.length)
// has
let range = {
start: 1,
end: 5
}
range = new Proxy(range, {
has(target, prop) {
return prop >=range.start && prop <= range.end
}
})
console.log(2 in range) //true
console.log(10 in range) // false
let obj = {
name: "yangang",
[Symbol("es")] : "es"
}
console.log(Object.getOwnPropertyNames(obj))
console.log(Object.getOwnPropertySymbols(obj))
console.log(Object.keys(obj))
for (let key in obj){
console.log(key)
}
let userinfo = {
username : "yangang",
age : 34,
_password : "***"
}
userinfo = new Proxy(userinfo, {
ownKeys(target) { // 循环遍历
return Object.keys(target).filter(key => !key.startsWith("_")) //过滤下划线为_的键值属性
}
})
console.log(userinfo)
for (let key in userinfo) {
console.log(key)
}
let str3 = Object.keys(userinfo)
console.log(Object.keys(userinfo))
let tokenUserinfo = {
username : "yangang",
age : 34,
_password : "***"
}
tokenUserinfo = new Proxy(tokenUserinfo, {
get(target, prop) {
if(prop.startsWith("_")) {
throw new Error("不可方位")
}else{
return target[prop]
}
},
set(target, prop, value) {
if(prop.startsWith("_")) {
throw new Error("不可设置")
}else{
target[prop] = value
return true
}
},
ownKeys(target) { // 循环遍历
return Object.keys(target).filter(key => !key.startsWith("_")) //过滤下划线为_的键值属性
},
deleteProperty(target, p) {
if(p.startsWith("_")) {
throw new Error("不可删除")
}else{
delete target[p]
return true
}
}
})
try {
//tokenUserinfo._password = "xxxx" //不可设置
delete tokenUserinfo._password // 不可删除
}catch(e) {
console.log(e.message)
}
//apply
let sum = (...args) => {
let num = 0
args.forEach(item => {
return num += item
})
return num
}
sum = new Proxy(sum, { // 处理函数的返回结果
apply(target, thisArg, argArray) {
return target(...argArray) * 2
}
})
console.log(sum(1, 2))
console.log(sum.call(null,1,2,3))
// construct new
let User = class {
constructor(name) {
this.name = name
}
}
User = new Proxy(User, {
construct(target, argArray, newTarget) {
console.log(newTarget)
return new target(...argArray)
}
})
console.log(new User("design"))
一起设计吧