zoukankan      html  css  js  c++  java
  • 使用proxy来简单的实现一个观察者

            var obv = (function() {
    
                var cache = new Map();
    
                var observe = function (proxy, fn) {
                    if (!cache.has(proxy)) {
                        cache.set(proxy, []);
                    };
                    cache.get(proxy).push(fn);
                };
    
                var observData = function(obj) {
                    return new Proxy(obj, {
                        set: function(target, key, value, receiver) {
                            var old = target[key];
                            if (old !== value) {
                                var result = Reflect.set(target, key, value, receiver);
                                var arr = cache.get(receiver);
                                arr && arr.forEach(function(observer) {
                                    return observer.call(target, key, value, old);
                                });
                                return result;
                            };
                        }
                    });
                };
    
                return {
                    observe: observe,
                    observData: observData
                };
            }());

    使用姿势:

    1.使用

    obv.observData

       监听一个数组或者一个对象;

    2.然后使用

    obv.observe

    来监听回调函数,第一个参数就是Proxy的实例,第二个参书就是其对应的回调
            var person = obv.observData({
                name: '徐志伟',
                age: 26
            });
    
            var pp = obv.observData({
                personality: '哈哈',
                abc: '去屎'
            });
    
            var dd = obv.observData([1, 2, 3, 4]);
    
            function print(key, value, old) {
                console.log(key, value, old);
            };
            function print2(key, value, old) {
                console.log(key, value, old);
            };
    
            obv.observe(dd, print);
            obv.observe(dd, print2);
            // person.name = '徐志伟1';
            // pp.personality = '斤斤计较军军军军';
            dd[0] = "111";
  • 相关阅读:
    最大流问题的几种经典解法综述
    有上下界的网络流
    hiho一下
    poj 1018
    状压dp
    hdu 1043
    Poj1015
    7.14
    sgu 128
    (zhuan)
  • 原文地址:https://www.cnblogs.com/sorrowx/p/7419558.html
Copyright © 2011-2022 走看看