zoukankan      html  css  js  c++  java
  • 关于mvvm的简单实现,模拟vue(1)------ 数据劫持

    我们在使用vue开发时,一般都是通过以下代码来创建Vue实例的
    1
    let vm = new Vue({ 2 el:"#app", 3 data:{ 4 a:1, 5 b:1 6 } 7 });
     1 此次我们通过自己写一个方法类,来简单模拟Vue实现MVVM数据双向绑定
     2      创建index.html测试代码   
     3         <div id="app">
     4             <p>{{a}}</p>
     5             <p>{{b}}</p>
     6         </div>
     7         <script src="mvvm.js"></script>
     8         <script>
     9             let demo = new Demo({
    10                 el:"#app",
    11                 data:{
    12                     a:1,
    13                     b:1
    14                 }
    15             })
    16         </script>    

     接下来是js逻辑的实现部分:

    1,通过Object.defineProperty对data上的属性实现深度数据劫持

     3 
     4 function Demo (options){
     5     //首先将options,和data绑定到实例上
     6     this.$options = options;
     7     let data = this._data = options.data;
     8     //对data进行数据劫持处理
     9     observe(this._data);
    10 
    11     //将data数据里的属性挂载到this实例上
    12     for (let key in data) {
    13         Object.defineProperty(this,key,{
    14             enumerable:true,
    15             get(){
    16                 return this._data[key];
    17             },
    18             set(newVal){
    19                 this._data[key]=newVal;
    20             }
    21         })
    22     }
    23 }
    24 
    25 function Observe(data){
    26     //遍历data,对每一个属性进行劫持
    27     for (let key in data) {
    28         let value = data[key];
    29         console.log(value);
    30         Object.defineProperty(data,key,{
    31             enumerable:true,
    32             get(){
    33                 return value;
    34             },
    35             set(newVal){
    36                 value=newVal;
    37                 observe(value);//=>如果修改的值是一个对象,对其进行深度劫持
    38             }
    39         });
    40         observe(value);//=>深度劫持,如果valu是对象,继续进行劫持处理
    41     }
    42 }
    43 function observe(data){
    44     if(typeof data !== "object") return;
    45     new Observe(data);
    46 }

    测试结果:
    输出demo,可以看见,所有data属性都具有了getter和setter属性

    另外重新赋值,也会持续进行数据劫持

  • 相关阅读:
    HDU 2844 Coins(多重背包)
    HDU 4540 威威猫系列故事——打地鼠(DP)
    Codeforces Round #236 (Div. 2)
    FZU 2140 Forever 0.5
    HDU 1171 Big Event in HDU(DP)
    HDU 1160 FatMouse's Speed(DP)
    ZOJ 3490 String Successor
    ZOJ 3609 Modular Inverse
    ZOJ 3603 Draw Something Cheat
    ZOJ 3705 Applications
  • 原文地址:https://www.cnblogs.com/yoyosir/p/8204071.html
Copyright © 2011-2022 走看看