zoukankan      html  css  js  c++  java
  • 使用 Proxy | Reflect 做数据劫持 | 全局数据监听

    使用 Proxy | Reflect 做数据劫持 | 全局数据监听

    >  使用demo

    import globalData from './globalData'
    
    const {userInfo} = globalData
    userInfo.watch('name', str =>{
        console.log('My name is:',str)
    })
    userInfo.name = 'xxxxxxx'

    > globalData.js

    import _event from "./event";
    
    const validator = {
      set: function (target, prop, value) {
        target.emit(prop, value);
        return Reflect.set(...arguments);
      },
      get: function () {
        return Reflect.get(...arguments);
      },
    };
    const creat = (defaultData = {}) => {
      return new Proxy(
        Object.assign(Object.create(_event), defaultData),
        validator
      );
    };
    
    const globalData = {
      userInfo: creat({}),
    };
    
    export default globalData;

    > event.js

    function Events() {
        // 放置所有添加的 监听事件
        this._events = {};
    }
    Events.prototype = {
        on: function (name, fn, ...argOrg) {
            // 必传参数验证
            if (!name || !fn) {
                throw new Error(`[Events TypeError] Failed to execute 'Events' on '${name}' : 2 arguments required`);
            }
            // 阻止重复添加相同的监听
            let fns = this._events[name] || [];
            if (fns.find((item) => item.fnOrg === fn)) {
                return;
            }
            this._events[name] = fns.concat({
                fn: (arg) => fn.apply(null, [...argOrg, ...arg]),
                fnOrg: fn
            });
        },
        watch() {
            this.on(...arguments);
        },
        once: function (name, fn, ...argOrg) {
            const onFn = (...arg) => {
                fn.apply(null, arg);
                this.off(name, onFn);
            };
            this.on(name, onFn, ...argOrg);
        },
        emit: function (name, ...arg) {
            (this._events[name] || []).forEach((item) => {
                item.fn(arg);
            });
        },
        off: function (name, fn) {
            // 无参数 : 清掉所有监听
            if (!arguments.length) {
                this._events = Object.create(null);
            }
            // 一个参数 : 清掉该事件名下所有监听
            if (arguments.length == 1) {
                delete this._events[name];
            }
            let fns = this._events[name];
            if (!fns || !fns.length) return;
            this._events[name] = (fns || []).filter((item) => {
                return item.fnOrg !== fn;
            });
        }
    };
    export default new Events();
  • 相关阅读:
    Pytorch版本yolov3源码阅读
    Darknet卷基层浅层特征可视化教程
    YOLOv3-darknet 内容解析
    YOLOv2-darknet 内容解析
    YOLOv1-darknet 内容解析
    Qt5.2+opencv2.4.9配置安装过程
    Android程序示例
    【Cuda编程】加法归约
    算法设计与分析课程的时间空间复杂度
    【算法分析】实验 4. 回溯法求解0-1背包等问题
  • 原文地址:https://www.cnblogs.com/tommymarc/p/12915026.html
Copyright © 2011-2022 走看看