zoukankan      html  css  js  c++  java
  • Javascript写一个缓存代理(AOP)

    自己写了一个缓存代理,使用代理模式,支持指定函数、支持按参数缓存,原创

    后续会支持缓存异步数据

    CacheProxy:

    function CacheProxy(obj,proxyMethods){
            var _cache={};
            var _getType=Object.prototype.toString;  
            var _this = this;
            var _getCacheName=function(methodName,args){
                var caches = [];
                caches.push(methodName);
                for (var i = 0,len=args.length; i <len; i++) {
                    caches.push(args[i]);
                }
                return caches.join('_');
            };
            if (_getType.apply(obj)!=="[object Object]") {
                console.info("parameter obj must be object");
                return;
            }
            if (_getType.apply(proxyMethods)!=="[object Array]") {
                if (proxyMethods===undefined ) {
                    proxyMethods=[];
                }
                else{
                    console.info("parameter proxyMethods must be Array");
                    return;                
                }
            }
    
            for(attr in obj){
                if(_getType.apply(obj[attr])==="[object Function]"){
                    (function(attr){
                       _this[attr]=function(){
                        if (proxyMethods.length===0 || proxyMethods.indexOf(attr)>-1) {
                            var cacheName = _getCacheName(attr,_this[attr].arguments);
                            if (_cache[cacheName]===undefined) {
                                return _cache[cacheName];
                            }
                            _cache[cacheName] = obj[attr].apply(_this,arguments);
                            return _cache[cacheName];
                        }
                        
                        return obj[attr].apply(_this,arguments);
                    }; 
                })(attr);
                    
                }
            }

    客户端:

        function Person(){
            this.sayName=function(a,b,c){
                return "fan";
            };
            this.sayHello=function(a,b){
                return "Hello";
            };
        }
    
    var p = new Person();
    var cacheProxy = new CacheProxy(p,["sayName","sayHello"]);//第二个参数可以不写
    console.info(cacheProxy.sayName());
    console.info(cacheProxy.sayName("1"));
    console.info(cacheProxy.sayName("1","2"));
    console.info(cacheProxy.sayName("1","2"));//取缓存
    console.info(cacheProxy.sayName("1"));//取缓存
     
    console.info(cacheProxy.sayHello());
    console.info(cacheProxy.sayHello("1"));
    console.info(cacheProxy.sayHello("1","2"));
    console.info(cacheProxy.sayHello("1","2"));//取缓存

    案例2、缓存函数:

        Function.prototype.beforeAsync = function (func) {
            var _self = this;
            return function () {
                func.apply(this, [_self]);
            };
        };
     cacheHandle.CACHE={};
    function cacheHandle(func){
            var funcID = func.toString().hash();
            if(cacheHandle.CACHE[funcID] === undefined){
                cacheHandle.CACHE[funcID] = func(); 
            }
            return cacheHandle.CACHE[funcID];
    }

    //--------------客户端------------ function a(){
    return "a"; }; var data = a.beforeAsync(cacheHandle)(); data = a.beforeAsync(cacheHandle)();//取缓存
  • 相关阅读:
    二进制求和
    删除排序数组中的重复项--leetcode算法题
    vue render
    数字实现千分位分隔符
    用nodejs实现向文件的固定位置插入内容
    工作中用到的正则表达式
    组件toast(类似于element-ui的message组件)的实现
    用svg实现一个环形进度条
    批量删除当前文件夹下面的.svn文件夹
    windows下的包管理器scoop
  • 原文地址:https://www.cnblogs.com/fanfan-90/p/12821319.html
Copyright © 2011-2022 走看看