zoukankan      html  css  js  c++  java
  • Vue做数据和视图原理(数据劫持)

    Vue做数据和视图相关变化,原理是用以下两个方法实现“数据劫持”。

    • Object.defineProperty() 只能劫持一个对象

    • Object.defineProperties() 可以劫持多个对象

    定义Vue中组件对象data中的所有变量的setter,让他们在被设置的时候,刷新相关视图。

     

    使用Object.defineProperty()方法实现数据劫持:

     

    <body>
        <button>按我改A</button>
        <button>按我改B</button>
    </body>
    
    <script type="text/javascript">
        //只要这个对象被赋值,立马触发set和get函数(被它们劫持)
        var obj = { 
            a: 100,
            b: 200
        }
    
        var objA = obj['a']
        var objB = obj['b']
        
        Object.defineProperty(obj, 'a', {
            configurable: true,    //表示属性可以配置
            enumerable: true,      //表示这个属性可以遍历
        
            //setter 每次设置这个对象的属性时,都会被set方法劫持
            set:function(value){
                alert("set执行了,修改了a");
                objA = value
                console.log(value)
            },
        
            //getter 每次获取对象的这个属性时,都会被get方法劫持
            get:function(){
                alert("get执行了,读取了a");
                return objA; //被set函数接收
            }
         })
        
         document.getElementsByTagName("button")[0].onclick = function(){
            obj.a++; //obj.a的值变化Object.definePropertie()函数的set和get就能拦截到
         }
    </script>

    使用Object.defineProperties()方法实现数据劫持:

    <body>
        <button>按我改A</button>
        <button>按我改B</button>
    </body>
    <script type="text/javascript">
        var obj = { //只要这个对象被赋值,立马触发set和get函数
            a: 100,
            b: 200
        }
    
        var objA = obj['a']
        var objB = obj['b']
        
        Object.defineProperties(obj, {
            a:{
                //setter 每次设置这个对象的属性时,都会被set方法劫持
                set:function(value){
                    alert("A的set执行了,修改了a");
                    objA = value
                    console.log(value)
                },
        
                //getter 每次获取对象的这个属性时,都会被get方法劫持
                get:function(){
                    alert("A的get执行了,读取了a");
                    return objA;
                }
            },
            b:{
                set:function(value){
                    alert("B的set执行了,修改了b");
                    objB = value
                    console.log(value)
                },
        
                get:function(){
                    alert("B的get执行了,读取了b");
                    return objB; 
                }
            },
         })
        
         document.getElementsByTagName("button")[0].onclick = function(){
            obj.a++; //obj.a的值变化Object.definePropertie()函数的set和get就能拦截到
         }
        
         document.getElementsByTagName("button")[1].onclick = function(){
            obj.b++; 
         }
    </script>
  • 相关阅读:
    [禅悟人生]学习是一种偏执
    [家里蹲大学数学杂志]第393期中山大学2015年计算数学综合考试考博试题回忆版
    [家里蹲大学数学杂志]第392期中山大学2015年泛函分析考博试题回忆版
    [数分提高]2014-2015-2第2教学周第1次课
    [数分提高]2014-2015-2第1教学周第2次课
    [数分提高]2014-2015-2第1教学周第1次课
    所教课程
    16种床上动作的内涵图,你都看懂了吗?
    为什么美国学生学的数学比我们简单却还能做出很牛逼的东西?
    来自数学君的羊年祝福
  • 原文地址:https://www.cnblogs.com/xuyx/p/11931335.html
Copyright © 2011-2022 走看看