Object.defineProperty和proxy的用法

众所周知,这两个api都可以实现数据的代理与监视.

Object.defineProperty

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>defineProperty</title>
</head>
<body>
    <button class="btn1">查看age的值</button>
    <button class="btn2">修改age的值</button>
    <script>
    let btn1 = document.querySelector('.btn1')
    let btn2 = document.querySelector('.btn2')
     let data = {
        name:'wjt',
        age:28,
        done:()=>{
            console.log('I am a coder')
        }
     }

     let _data = {}
     Object.defineProperty(_data,'name',{
        get(){
            console.log('触发了get方法')
            return data.name
        },
        set(newVal){
            console.log('触发了set方法')
            data.name = newVal
        },
        enumerable:true,
        configurable:true
     })

    btn1.onclick=()=>{
        console.log(_data.name,'_data的name')
    }
    btn2.onclick=()=>{
        _data.name = '王惊涛'
        console.log(data,'data对象')
        console.log(_data,'_data对象')
    }
    </script>
</body>
</html>

Proxy

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>proxy</title>
</head>

<body>
    <button class="btn1">修改值</button>
    <input type="text" class="input">
    <button class="btn2">直接修改_data</button>
    <button class="btn3">查看_data</button>
    <script>
        let btn1 = document.querySelector('.btn1')
        let btn2 = document.querySelector('.btn2')
        let btn3 = document.querySelector('.btn3')
        let input = document.querySelector('.input')
 
        input.oninput = ()=>{
            data.age = Number(input.value)
            console.log(data, 'data的数据,输入框')
            console.log(_data, '_data的数据,输入框')
        }

        let data = {
            name: 'wjt',
            age: 28,
        }
        let _data = new Proxy(data,{
            get:function(obj,prop,value){
                console.log(obj,prop,value,'proxy内发现属性被查看')
                return obj[prop]
            },
            set:function(obj,prop,value){
                console.log(obj,prop,value,'proxy内发现属性被修改')
                obj[prop] = value
                return true;
            }
        })
        console.log(data, 'data的数据')
        console.log(_data, '_data的数据')

        btn1.onclick = () => {
            data.name = '王惊涛'
            console.log(data, 'data的数据,修改后')
            console.log(_data, '_data的数据,修改后')
        }
        btn2.onclick = ()=>{
        _data.name = '马师'
        _data.age = 30
        console.log(data,'直接修改后的data')
        console.log(_data,'直接修改后的_data')
        }
        btn3.onclick = ()=>{
            console.log(_data.name,'查看_data.name')
            console.log(_data.age,'查看_data.age')
        }
    </script>
</body>

</html>

猜你喜欢

转载自blog.csdn.net/m0_54741495/article/details/132359675