代理引用类型的操作。

    1. // Proxy 对象
    2. const person = {
    3. name: 'zce',
    4. age: 20
    5. }
    6. const personProxy = new Proxy(person, {
    7. // 监视属性读取
    8. get (target, property) {
    9. return property in target ? target[property] : 'default'
    10. // console.log(target, property)
    11. // return 100
    12. },
    13. // 监视属性设置
    14. set (target, property, value) {
    15. if (property === 'age') {
    16. if (!Number.isInteger(value)) {
    17. throw new TypeError(`${value} is not an int`)
    18. }
    19. }
    20. target[property] = value
    21. // console.log(target, property, value)
    22. }
    23. })
    24. personProxy.age = 100
    25. personProxy.gender = true
    26. console.log(personProxy.name)
    27. console.log(personProxy.xxx)

    Proxy 对比 Object.defineProperty(),比Object.defineProperty()更好用:

    • Proxy 可以监视读写以外的操作
    • Proxy 可以很方便的监视数组操作
    • Proxy 不需要侵入对象 ```javascript // 优势1:Proxy 可以监视读写以外的操作 —————————————

    const person = { name: ‘zce’, age: 20 }

    const personProxy = new Proxy(person, { deleteProperty (target, property) { console.log(‘delete’, property) delete target[property] } })

    delete personProxy.age console.log(person)

    // 优势2:Proxy 可以很方便的监视数组操作 —————————————

    const list = []

    const listProxy = new Proxy(list, { set (target, property, value) { console.log(‘set’, property, value) target[property] = value return true // 表示设置成功 } })

    listProxy.push(100) listProxy.push(100)

    // 优势3:Proxy 不需要侵入对象 —————————————

    const person = {}

    Object.defineProperty(person, ‘name’, { get () { console.log(‘name 被访问’) return person._name }, set (value) { console.log(‘name 被设置’) person._name = value } }) Object.defineProperty(person, ‘age’, { get () { console.log(‘age 被访问’) return person._age }, set (value) { console.log(‘age 被设置’) person._age = value } })

    person.name = ‘jack’

    console.log(person.name)

    // Proxy 方式更为合理 const person2 = { name: ‘zce’, age: 20 }

    const personProxy = new Proxy(person2, { get (target, property) { console.log(‘get’, property) return target[property] }, set (target, property, value) { console.log(‘set’, property, value) target[property] = value } })

    personProxy.name = ‘jack’

    console.log(personProxy.name)

    ```