美文网首页
Object.defineProperty

Object.defineProperty

作者: 土豪码农 | 来源:发表于2018-12-05 20:56 被阅读0次

    记得之前看vue的原理,双向数据绑定,说是用ES5的Object.defineProperty里面的getter和setter方法,然后就记下来,每次有人面试问到,都这样说,其实根本不知道,这个东西干嘛用的.最近在看你所\不知道的javascript(上卷),有详细讲到了关于Object.defineProperty.

    在Es5中可以使用getter和setter部分改写默认操作,但是只能应用在单个属性上,无法应用在整个对象上。getter是一个隐藏函数,会在获取属性值时调用。setter也是一个隐藏属性,会在设置属性值时调用。

     Object.defineProperty(
            myObject,             //目标对象
            "b",                    //属性名
            {   //描述符
                //给b设置一个getter
                get:function(){
                    return this.a*2
                     },
                //确保b会出现在对象的属性列表中
                enumerable:true
                }
            );
            console.log(myObject.a)  //2
            console.log(myObject.b)  //4
    }
    

    就是当给属性赋值或者获取属性的时候会调用get,和set里面的方法.

    vue里面的数据绑定就是基于defineProperty的原理去实现的,那么就自己尝试一下如何去实现一个简单的双向数据绑定吧

    <body>
    <input type="text" oninput="changeInput(this)">
    <p id="inputValue"></p>
    <script>
        const obj = {
        }
        Object.defineProperty(obj,'a',{
            set:function(value){
                this._a_ = value
                document.getElementById('inputValue').innerHTML = value
            },
            get: function(){
                return this._a_
            },
            enumerable: true
        })
    
        function changeInput(target) {
            obj.a = target.value
        }
    </script>
    </body>
    

    监听input的数据变化,然后赋值给obj.a,然后会触发set方法,就实现了一个简单数据绑定啦!!!

    相关文章

      网友评论

          本文标题:Object.defineProperty

          本文链接:https://www.haomeiwen.com/subject/drzwcqtx.html