首页>>新闻中心>>ES6学习方法

ES6 代理 Proxy

来源: 本站    发布时间: 2021-03-01 22:10    阅读次数:

//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"))
一起设计吧
下一篇: ES6一Proxy
BACK