使用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";
时间: 2024-08-26 22:58:24

使用proxy来简单的实现一个观察者的相关文章

Phaser提供了Button对象简单的实现一个按钮

Phaser是一个简单易用且功能强大的html5游戏框架,利用它可以很轻松的开发出一个html5游戏.在这篇文章中我就教大家如何用Phaser来制作一个前段时间很火爆的游戏:Flappy Bird,希望大家看后也能做出自己的html5游戏.大家可以先点击这里来试玩一下我已经做好的这个游戏,感受一下Phaser的游戏效果,游戏的完整代码我已经放到github上了.支持的浏览器:IE9+.Firefox.Chrome.Opera.Safari以及移动端的能支持html5的浏览器,推荐使用谷歌浏览器,

神经进化学的简单介绍和一个简单的CPPN(Compositional Pattern Producing Networks)DEMO

最近迷上神经进化(Neuroevolution)这个方向,感觉是Deep Learning之后的一个很不错的研究领域.该领域的一个主导就是仿照人的遗传机制来进化网络参数与结构.注意,连网络结构都可以进化,就是不像是传统的神经网络,结构是提前定义好的. 最近这个领域研究的比较多的是 弗罗里达大学的Stanley教授,主要的贡献有NEAT,HyperNEAT以及Novelty Search,有兴趣的可以去google之. NEAT与HyperNEAT都是一种indirect coding算法,目的在

如何利用一条简单语句判断一个整数是否为2的整数次幂

在写代码的过程中可能会遇到判断一个整数是否为2的整数次幂的问题,除了枚举的方法,还可以利用二进制的知识进行简单快速判断. 2的整数次幂用二进制表示只存在一个1和n个0,因此,我们利用位运算&判断一个整数a与a-1的&是否为0即可.具体代码如下. 代码非常简洁. 12345678910111213141 大专栏  如何利用一条简单语句判断一个整数是否为2的整数次幂51617 #include<bits/stdc++.h>using namespace std;typedef lo

[Design Pattern] Proxy Pattern 简单案例

Proxy Pattern, 即代理模式,用一个类代表另一个类的功能,用于隐藏.解耦真正提供功能的类,属于结构类的设计模式. 下面是 代理模式的一个简单案例. Image 定义接口,RealImage, ProxyImage 都实现该接口.RealImage 具有真正显示功能,ProxyImage 作为代表,暴露给客户端使用. 代码实现: public interface Image { public void display(); } RealImage 的实现,提供真正的功能 public

Java通过JDK动态代理简单的实现一个AOP

首先说一下,因为自己还没有去研读spring的AOP的源码,只是大致知道其功能,便想着自己先手动实现一个先看看,觉得这样以后研读源码的时候会收获更多! 实现:做一个在添加注解的方法执行之前,可以先执行另一个方法.类似AOP(@Brfore),不明白的同学可以去百度下,这边只做一个简单的现实. 首先准备一个接口IEat,作为你要做的事情比如,eat(): public interface IEat { void eat(); } 然后两个类去实现这个接口,一个是我们的主要方法(原有不可变动的功能,

简单的实现一个python3的多线程爬虫,爬取p站上的每日排行榜

大概半年前我开始学习python,也就是半年前,我半抄半改的同样的爬虫写了出来,由于是单线程的程序,当中出了一点的小错就会崩溃,但是那个爬虫中的header之类的东西现在依旧还是能够使用的,于是我就把之前那份的保留了下来.由于有一半是抄的,自己得到的并不多,这次重写,我相当于又重新学习了一遍.,当中有可能有认识不足的,欢迎指正. 首先我们要想登陆p站,得构造一个请求,p站登陆的请求包括: request = urllib.request.Request( #创建请求 url=login_url,

Linux下JNI的简单使用---第一个helloworld程序

一.环境介绍 VMwareWorkstation9.0 + RedHat5.1Enterprise + jdk1.7.0 二.第一个使用JNI的hello程序步骤 1.编写一个使用jni调用的简单Java程序 package org.bt.test public class HelloJni {             private native String getHello(); //申明本地函数             //加载共享库             static {      

Android简单的编写一个txt阅读器(没有处理字符编码),适用于新手学习

本程序只是使用了一些基本的知识点编写了一个比较简单粗陋的txt文本阅读器,效率不高,只适合新手练习.所以大神勿喷. 其实想到编写这种程序源自本人之前喜欢看小说,而很多小说更新太慢,所以本人就只能找一个完本的.txt小说下载下来,有没有网络都可以看,当然现在不看那玩意了. 废话就不说了,程序中使用到的有4个类,5个xml文件,其中3个布局文件.String.xml.AndroidManifest.xml. 先看效果图吧(虽然很丑):     下面就上代码吧,本人都注释好了,由于本人技术还不行,注释

使用PHP来简单的创建一个RPC服务

RPC全称为Remote Procedure Call,翻译过来为"远程过程调用".主要应用于不同的系统之间的远程通信和相互调用. 比如有两个系统,一个是PHP写的,一个是JAVA写的,而PHP想要调用JAVA中的某个类的某个方法,这时候就需要用到RPC了. 怎么调?直接调是不可能,只能是PHP通过某种自定义协议请求JAVA的服务,JAVA解析该协议,在本地实例化类并调用方法,然后把结果返回给PHP. 这里我们用PHP的socket扩展来创建一个服务端和客户端,演示调用过程. RpcS