zoukankan      html  css  js  c++  java
  • 学习javascript设计模式之装饰者模式

    1、装饰者模式定义:给对象动态添加职责的方式称为装饰者(decorator)模式。

    js如何实现装饰者模式

    通过保存原函数引用方式改写某函数

    window.onload = function(){alert(1);}
    var _oldonload = window.onload || function(){};
    window.onload = function(){
        _oldonload();
        alert(2);
    }

    缺点:1、_oldonload需维护。 2、this被劫持。如document.getElementById this会指向window。

    AOP装饰函数:

    Function.prototype.before = function(beforefn){
        var __self = this;//保存原函数的引用
        return function(){//返回了包含原函数和新函数的代理函数
            beforefn.apply(this,arguments);//执行新函数,且保证this不被劫持,新函数接受的参数也会原封不动被传入原函数,新函数和原函数之间执行
            return __self.apply(this,arguments);//执行原函数并返回原函数的执行结果,并且保证this不被劫持
        }
    }
    Function.prototype.after = function (afterfn){
        var __self = this;
        return function (){
            var ret = __self.apply(this,arguments);
            afterfn.apply(this,arguments);
            return ret;
        }
    }

    var t1 = function(param){
        //alert(111);
        console.log(param);//{a:"a",name:"sss"}
    }


    var t2 = t1.before(function(param){
        //alert(222);
        param.name = 'sss';
    })
    t2({a:'a'});

    //实例一

          var showlogin = function(){
            console.log("打开登录浮动层");
    
        }
    
        var log = function(){
            console.log('上报标签'+this.getAttribute("tag"));
        }
    
        showlogin=showlogin.after(log);
        document.getElementById("btn").onclick= showlogin;

          打开登录浮动层
          上报标签showlog
  • 相关阅读:
    腾讯企业微信机器人通知
    python 协程、异步、async
    pytest获取测试用例执行结果(钩子函数:pytest_runtest_makereport)
    pytest hook使用
    sqlalchemy backref解释
    docker 启动mysql 并本地连接
    Flask用paginate实现数据分页
    在flask中使用flaskmigrate管理数据库
    ExtAspNet v2.3.5
    Caliburn Micro下轻松实现ListView的全选功能
  • 原文地址:https://www.cnblogs.com/junwu/p/4742579.html
Copyright © 2011-2022 走看看