zoukankan      html  css  js  c++  java
  • 设计模式之观察者模式 DOM0级和DOM2级封装

    DEM0级:

       var Observer = (function() {
            /* 
                声明一个空对象,存储事件和触发事件
            */
            var obj = {};
    
            return {
                // 添加事件---事件名,事件处理程序
                add: function(name, fn) {
                    // 将事件写入对象
                    obj[name] = fn;
                },
                // 触发事件---事件名,参数
                trigger: function(name, args = []) {
                    obj[name].apply(obj, args);
                }
            };
        })();
        // Observer 就是观察者, 接口暴露的对象
        module.exports = Observer;
    });

    DOM2级:

    var Observer = (function() {
            /* 
                声明一个空对象,存储事件和触发事件
            */
            var obj = {};
    
            return {
                // 添加事件---事件名,事件处理程序
                add: function(name, fn) {
                    // 将事件写入对象---- 存储事件使用数组
                    // 判断事件是否存在
                    if (obj[name]) {
                        // 存在
                        obj[name].push(fn);
    
                    } else {
                        // 不存在
                        obj[name] = [fn];
                    }
                },
                // 触发事件---事件名,参数
                trigger: function(name, args = []) {
                    obj[name].forEach(function(value) {
                        value.apply(obj, args);
                    });
                  
                },
                // 取消事件
                off: function(name, fn) {
                    if (arguments.length == 0) {
                        // 取消所有事件
                        obj = {};
                    } else if (arguments.length == 1) {
                        // 取消指定名称的事件
                        obj[name] = [];
                    } else if (arguments.length == 2) {
                        obj[name].forEach(function(value, index) {
                            if (value == fn) {
                                // 在数组中移除该值
                                obj[name].splice(index, 1);
                            }
                        });
                    }
    
                    console.log(obj);
                },
                // 一次性事件
                once: function(name, fn) {
                    // 备份this
                    var me = this;
                    // 为了防止传入为函数体
                    function demo() {
                        fn();
                        // 移除事件
                        me.off(name, demo);
                    }
                    // 添加事件
                    this.add(name, demo);
    
                }
            };
        })();  
  • 相关阅读:
    常看本地是否安装Git和maven工具
    Git 安装和使用Tips
    Jmeter 获取系统时间,和对系统时间进行增减时间
    Java 中的系统时间
    Go语言
    数据拆分之 垂直拆分 and 水平拆分
    在Windows和UNIX下利用PHP和LDAP进行身份验证
    Linux中使用crontab命令定时执行shell脚本或其他Linux命令
    php empty()和isset()的区别
    php 判断是否get传值的参数是否存在
  • 原文地址:https://www.cnblogs.com/yess/p/12181221.html
Copyright © 2011-2022 走看看