使用proxy来简单的实现一个观察者

Posted Sorrow.X

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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";

 

以上是关于使用proxy来简单的实现一个观察者的主要内容,如果未能解决你的问题,请参考以下文章

学习 vue2.0/3.0 中的proxy和Object.defineProperty 小记

观察者模式

Vue3.0采用新特性Proxy来实现数据状态的响应,它的原理是啥?

Vue3.0 双向绑定原理

只有Kotlin协同程序的数据流?

如何在MVVM架构中观察RecyclerView适配器中的LiveData?