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();
  • 相关阅读:
    html表单
    html基础
    MySQL数据库 数据的更新
    JAVA数据库编程
    集合框架
    线程和进程
    反射
    centos 7环境
    js中的this
    javascript的作用域以及闭包现象
  • 原文地址:https://www.cnblogs.com/tommymarc/p/12915026.html
Copyright © 2011-2022 走看看