数据双向绑定的三种方式

1.脏数据检查机制。使用的是angular的轮询的方式   

  缺点:性能低,

  好处:兼容ie8

2.数据劫持 Object.defineProperty() es5中的语法

  这个无法被修复的,vue不支持ie678

3.proxy 方法 es6中的新语法

 proxy的方法现在用的还是很少的,详细解释一下proxy这个方法

  1.什么是Proxy?它的作用是?

    据阮一峰文章介绍:Proxy可以理解成,在目标对象之前架设一层 "拦截",当外界对该对象访问的时候,都必须经过这层拦截,而Proxy就充当了这种机制,类似于代理的含义,它可以对外界访问对象之前进行过滤和改写该对象。

  Proxy基本语法

const obj = new Proxy(target, handler);

参数说明如下:

target: 被代理对象。
handler: 是一个对象,声明了代理target的一些操作。
obj: 是被代理完成之后返回的对象。

但是当外界每次对obj进行操作时,就会执行handler对象上的一些方法。handler中常用的对象方法如下:

1. get(target, propKey, receiver)
2. set(target, propKey, value, receiver)
3. has(target, propKey)
4. construct(target, args):
5. apply(target, object, args)

 1 const target = {
 2   name: 'kongzhi'
 3 };
 4 
 5 const handler = {
 6   get: function(target, key) {
 7     console.log(`${key} 被读取`);
 8     return target[key];
 9   },
10   set: function(target, key, value) {
11     console.log(`${key} 被设置为 ${value}`);
12     target[key] = value;
13   }
14 };
15 
16 const testObj = new Proxy(target, handler);
17 
18 /*
19   获取testObj中name属性值
20   会自动执行 get函数后 打印信息:name 被读取 及输出名字 kongzhi
21 */
22 console.log(testObj.name);
23 
24 /*
25  改变target中的name属性值
26  打印信息如下: name 被设置为 111 
27 */
28 testObj.name = 111;
29 
30 console.log(target.name); // 输出 111

如上代码所示:也就是说 target是被代理的对象,handler是代理target的,那么handler上面有set和get方法,当每次打印target中的name属性值的时候会自动执行handler中get函数方法,当每次设置 target.name 属性值的时候,会自动调用 handler中的set方法,因此target对象对应的属性值会发生改变,同时改变后的 testObj对象也会发生改变。同理改变返回后 testObj对象中的属性也会改变原对象target的属性的,因为对象是引用类型的,是同一个引用的。如果这样还是不好理解的话,可以简单的看如下代码应该可以理解了:

 1 const target = {
 2   name: 'kongzhi'
 3 };
 4 
 5 const testA = target;
 6 
 7 testA.name = 'xxx';
 8 
 9 console.log(testA.name); // 打印 xxx
10 
11 console.log(target.name); // 打印 xxx

 

posted @ 2019-06-28 11:27  羊羊羊小童鞋  阅读(579)  评论(0编辑  收藏  举报