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 相关文章推荐
Zero Clipboard js+swf实现的复制功能使用方法
Mar 07 Javascript
JS分割字符串并放入数组的函数
Jul 04 Javascript
JS鼠标事件大全 推荐收藏
Nov 01 Javascript
Javascript创建自定义对象 创建Object实例添加属性和方法
Jun 04 Javascript
jsvascript图像处理—(计算机视觉应用)图像金字塔
Jan 15 Javascript
JavaScript中函数表达式和函数声明及函数声明与函数表达式的不同
Nov 15 Javascript
JQuery fileupload插件实现文件上传功能
Mar 18 Javascript
让编辑器支持word复制黏贴、截屏的js代码
Oct 17 Javascript
canvas实现简易的圆环进度条效果
Feb 28 Javascript
JS获取字符对应的ASCII码实例
Sep 10 Javascript
解决Vue2.0 watch对象属性变化监听不到的问题
Sep 11 Javascript
js实现拾色器插件(ColorPicker)
May 21 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
连接到txt文本的超链接,不直接打开而是点击后下载的处理方法
2009/07/01 PHP
PHP中10个不常见却非常有用的函数
2010/03/21 PHP
浅析PHP中Collection 类的设计
2013/06/21 PHP
PHP PDOStatement::columnCount讲解
2019/01/30 PHP
Laravel基础_关于view共享数据的示例讲解
2019/10/14 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
2019/11/13 PHP
PHP7生产环境队列Beanstalkd用法详解
2020/05/19 PHP
js下弹出窗口的变通
2007/04/18 Javascript
js格式化金额可选是否带千分位以及保留精度
2014/01/28 Javascript
jquery 按键盘上的enter事件
2014/05/11 Javascript
javascript实现简单的html5视频播放器
2015/05/06 Javascript
js调用百度地图及调用百度地图的搜索功能
2015/09/07 Javascript
Highcharts使用简例及异步动态读取数据
2015/12/30 Javascript
js表单登陆验证示例
2016/10/19 Javascript
JavaScript自动点击链接 防止绕过浏览器访问的方法
2017/01/19 Javascript
vue better-scroll插件使用详解
2018/01/25 Javascript
js的新生代垃圾回收知识点总结
2019/08/22 Javascript
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
python strip()函数 介绍
2013/05/24 Python
Python Web服务器Tornado使用小结
2014/05/06 Python
Python3基础之输入和输出实例分析
2014/08/18 Python
详解Python中的文本处理
2015/04/11 Python
Python使用OpenCV进行标定
2018/05/08 Python
从DataFrame中提取出Series或DataFrame对象的方法
2018/11/10 Python
解决python字典对值(值为列表)赋值出现重复的问题
2019/01/20 Python
Pycharm新建模板默认添加个人信息的实例
2019/07/15 Python
使用python turtle画高达
2020/01/19 Python
python 爬取英雄联盟皮肤并下载的示例
2020/12/04 Python
HTML5实现QQ聊天气泡效果
2017/06/26 HTML / CSS
结婚典礼证婚词
2014/01/08 职场文书
《盘古开天地》教学反思
2014/02/28 职场文书
求职自我评价怎么写
2015/03/09 职场文书
前台接待岗位职责范本
2015/04/03 职场文书
小学生反邪教心得体会
2016/01/15 职场文书
关于应聘教师的自荐信
2016/01/28 职场文书
python中filter,map,reduce的作用
2022/06/10 Python