数据监听

作者: 出世Sunny | 来源:发表于2018-03-02 15:09 被阅读10次
对象的监听

es5Object.defineProperty是关键,一个已经定义好的对象,我们可以利用Object.defineProperty方法重写它的属性,添加get,set方法。

var obj = {
    name:"小明",
    age:18,
    say(){
        return "hello";
    }
}

for(let key in obj){
    let value = obj[key];  //利用闭包,存值
    Object.defineProperty(obj,key,{
        get(){
             return value;
        },
        set(val){
            console.log('改变了');
            value = val;
        },
    })
}

get,set回调里可以塞入我们想要的操作。当然,上述代码如果要严谨点的话,还应当区分是否监听原型链上的属性。可以用hasOwnProperty方法或者Object.keys()方法排除原型链上的属性。

数组的监听

因为种种历史原因,数组类型是没法用上面的方法进行监听的,而且因为种种历史原因和实现方式的缘故,数组里的元素改变是没法直接监听到的,(比如 arr[3] = 9),所以只能退而求其次监听数组的方法
实现思路很简单,在Array和需要监听的数组之间多构造一个数组对象,将监听数组的原型__proto__指向构造的数组对象即可,构造的数组对象自然可以覆写数组方法,并添加自己的操作。

var overRideArr = [];   //构造的数组对象
overRideArr['push'] = function(){
    console.log("监听操作");
    return [].push.apply(this,arguments)
} 

var arr = ['a','b','c']; //  待监听的数组
arr.__proto__ = overRideArr;  //改变原型指向

为什么要使用__proto__而不是创建一个继承Array的类,并在其内部改写对应方法呢?
因为除了 new Array(),别的方式无法返回数组类型,即使构造了一个类,new 出来的也是会是个对象。所以通过改变实例的原型指向,是目前监听数组最实用的方式。
哈?你说别的方式?当然就是直接覆写某个实例数组了,比如这样:

var arr = ['a','b','c']; //  待监听的数组
arr['push'] = function(){
    console.log("监听操作");
    return [].push.apply(this,arguments)
} 

这种方法只有不支持__proto__属性的时候才会用,远没有使用__proto__方便。

另外如果你真的很喜欢new的方式,其实可以包装一下,弄个形式,但是内里还是上面的代码。

function  OverArr(arr){
    arr.__proto__ = overRideArr;
    return arr;
}

var arr2 = ['a','b','c']; //  待监听的数组
arr2 = new OverArr(arr2);
//arr2 = OverArr(arr2);    这种写法也一样的

相关文章

  • 小程序 监听 data 数据

    小程序 监听 data 数据 组件中监听 普通页面中监听

  • 53-Vue-watch属性

    这里主要实现监听数据变化进行某些操作,两种方法对比 一.监听键盘事件 双向数据绑定 添加数据 绑定键盘监听事件 添...

  • vue,watch监听数据,数据监听

    vue,watch监听数据,数据监听 三个值: 1.第一个handler:其值是一个回调函数。即监听到变化时应该执...

  • 4 Vue计算属性computed、watch监听

    1、计算属性和watch监听的区别: (1).两者都可监听数据的变化,计算属性会return值,watch监听数据...

  • 数据监听

    对象的监听 es5的Object.defineProperty是关键,一个已经定义好的对象,我们可以利用Objec...

  • 数据监听

    上次我们实现了一个数据劫持,今天我们看一下数据的监听。什么是监听呢?请看以下代码: 劫持和监听的区别在于:劫持是针...

  • 数据监听

  • Vue3-watch和watchEffect

    watch watch可以监听一个或多个响应式数据, 一旦数据变化, 就自动执行监听回调 如果监听rective对...

  • Android之WIFI-WifiMonitor分析

    概述 详细1.怎么监听wpa_supplicant发送过来的数据 2.怎么将数据分发给监听者?1)监听者是怎么注册...

  • AngularJS $watch 监听

    监听$watch监听数据变化,有三个参数 $scope.$watch(“监听的属性”,function(new,o...

网友评论

    本文标题:数据监听

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