JavaScript装饰器函数(Decorator)实例详解


Posted in Javascript onMarch 30, 2017

本文实例讲述了JavaScript装饰器函数(Decorator)。分享给大家供大家参考,具体如下:

装饰器函数(Decorator)用于给对象在运行期间动态的增加某个功能,职责等。相较通过继承的方式来扩充对象的功能,装饰器显得更加灵活,首先,我们可以动态给对象选定某个装饰器,而不用hardcore继承对象来实现某个功能点。其次:继承的方式可能会导致子类繁多,仅仅为了增加某一个单一的功能点,显得有些多余了。

下面给出几个常用的装饰器函数示例,相关代码请查看github。

1 动态添加onload监听函数

function addLoadEvent(fn) {
  var oldEvent = window.onload;
  if(typeof window.onload != 'function') {
    window.onload = fn;
  }else {
    window.onload = function() {
      oldEvent();
      fn();
    };
  }
}
function fn1() {
  console.log('onloadFunc 1');
}
function fn2() {
  console.log('onloadFunc 2');
}
function fn3() {
  console.log('onloadFunc 3');
}
addLoadEvent(fn1);
addLoadEvent(fn2);
addLoadEvent(fn3);

JavaScript装饰器函数(Decorator)实例详解

2 前置执行函数和后置执行函数

Function.prototype.before = function(beforfunc) {
  var self = this;
  var outerArgs = Array.prototype.slice.call(arguments, 1);
  return function() {
    var innerArgs = Array.prototype.slice.call(arguments);
    beforfunc.apply(this, innerArgs);
    self.apply(this, outerArgs);
  };
};
Function.prototype.after = function(afterfunc) {
  var self = this;
  var outerArgs = Array.prototype.slice.call(arguments, 1);
  return function() {
    var innerArgs = Array.prototype.slice.call(arguments);
    self.apply(this, outerArgs);
    afterfunc.apply(this, innerArgs);
  };
};
var func = function(name){
  console.log('I am ' + name);
};
var beforefunc = function(age){
  console.log('I am ' + age + ' years old');
};
var afterfunc = function(gender){
  console.log('I am a ' + gender);
};
var beforeFunc = func.before(beforefunc, 'Andy');
var afterFunc = func.after(afterfunc, 'Andy');
beforeFunc('12');
afterFunc('boy');

执行结果,控制台打印如下:

I am 12 years old
I am Andy
I am Andy
I am a boy

3 函数执行时间计算

function log(func){
  return function(...args){
    const start = Date.now();
    let result = func(...args);
    const used = Date.now() - start;
    console.log(`call ${func.name} (${args}) used ${used} ms.`);
    return result;
  };
}
function calculate(times){
  let sum = 0;
  let i = 1;
  while(i < times){
    sum += i;
    i++;
  }
  return sum;
}
runCalculate = log(calculate);
let result = runCalculate(100000);
console.log(result);

注:这里我使用了ES2015(ES6)语法,如果你感兴趣可以查看前面关于ES6的相关内容。

JavaScript装饰器函数(Decorator)实例详解

当然,装饰器函数不仅仅这些用法。天猫使用的Nodejs框架Koa就基于装饰器函数及ES2015的Generator。希望这篇文章能起到抛砖引玉的作用,使你编写更优雅的JS代码。

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript中json操作技巧总结》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
Js 获取当前日期时间及其它操作实现代码
Mar 04 Javascript
javascript 兼容所有浏览器的DOM扩展功能
Aug 01 Javascript
jquery判断小数点两位和自动删除小数两位后的数字
Mar 19 Javascript
javascript工厂方式定义对象
Dec 26 Javascript
javascript类型系统 Window对象学习笔记
Jan 07 Javascript
JavaScript获取中英文混合字符串长度的方法示例
Feb 04 Javascript
canvas雪花效果核心代码分享
Feb 19 Javascript
vue+Java后端进行调试时解决跨域问题的方式
Oct 19 Javascript
vue axios 在页面切换时中断请求方法 ajax
Mar 05 Javascript
JS 使用 window对象的print方法实现分页打印功能
May 16 Javascript
vue.js使用watch监听路由变化的方法
Jul 08 Javascript
ES6使用 Array.includes 处理多重条件用法实例分析
Mar 02 Javascript
Angular.JS去掉访问路径URL中的#号详解
Mar 30 #Javascript
详解Angular.js数据绑定时自动转义html标签及内容
Mar 30 #Javascript
JavaScript观察者模式(publish/subscribe)原理与实现方法
Mar 30 #Javascript
Angular.js去除页面中显示的空行方法示例
Mar 30 #Javascript
JavaScript实现父子dom同时绑定两个点击事件,一个用捕获,一个用冒泡时执行顺序的方法
Mar 30 #Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
Mar 30 #Javascript
JavaScript mixin实现多继承的方法详解
Mar 30 #Javascript
You might like
php 全文搜索和替换的实现代码
2008/07/29 PHP
一个显示某段时间内每个月的方法 返回由这些月份组成的数组
2012/05/16 PHP
异步加载技术实现当滚动条到最底部的瀑布流效果
2014/09/16 PHP
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
浅谈php fopen下载远程文件的函数
2016/11/18 PHP
Yii框架日志记录Logging操作示例
2018/07/12 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
2019/09/19 PHP
一个JS翻页效果
2007/07/23 Javascript
JavaScript设计模式之外观模式实例
2014/10/10 Javascript
jQuery实现的在线答题功能
2015/04/12 Javascript
理解Javascript的call、apply
2015/12/16 Javascript
Bootstrap开关(switch)控件学习笔记分享
2016/05/30 Javascript
详细谈谈javascript的对象
2016/07/31 Javascript
前端分页功能的实现以及原理(jQuery)
2017/01/22 Javascript
AngularJS中的路由使用及实现代码
2017/10/09 Javascript
JS尾递归的实现方法及代码优化技巧
2019/01/19 Javascript
vue 插件的方法代码详解
2019/06/06 Javascript
node.js使用stream模块实现自定义流示例
2020/02/13 Javascript
[04:09]2014DOTA2国际邀请赛Ti西雅图 历届冠军相继出局 BBC综述今日比赛
2014/07/20 DOTA
[01:11:28]DOTA2-DPC中国联赛定级赛 RNG vs Phoenix BO3第一场 1月8日
2021/03/11 DOTA
python改变日志(logging)存放位置的示例
2014/03/27 Python
Python映射拆分操作符用法实例
2015/05/19 Python
Python爬虫番外篇之Cookie和Session详解
2017/12/27 Python
Python图像滤波处理操作示例【基于ImageFilter类】
2019/01/03 Python
对Python 获取类的成员变量及临时变量的方法详解
2019/01/22 Python
详解python函数的闭包问题(内部函数与外部函数详述)
2019/05/17 Python
使用python写一个自动浏览文章的脚本实例
2019/12/05 Python
Django自关联实现多级联动查询实例
2020/05/19 Python
基于python爬取梨视频实现过程解析
2020/11/09 Python
数据库测试通常都包括哪些方面
2015/11/30 面试题
《阳光》教学反思
2014/02/23 职场文书
2014年道德讲堂实施方案
2014/03/05 职场文书
大学生工作自荐书
2014/06/16 职场文书
小学生校园广播稿
2014/09/28 职场文书
律师授权委托书范本
2014/10/07 职场文书
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
2021/05/28 Python