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 相关文章推荐
40款非常棒的jQuery 插件和制作教程(系列一)
Oct 26 Javascript
javascript闭包的高级使用方法实例
Jul 04 Javascript
原始的js代码和jquery对比体会
Sep 10 Javascript
Js判断参数(String,Array,Object)是否为undefined或者值为空
Nov 04 Javascript
jQuery.position()方法获取不到值的安全替换方法
Mar 13 Javascript
javascript字符串函数汇总
Dec 06 Javascript
jquery实现树形菜单完整代码
Dec 29 Javascript
详解JavaScript中的属性和特性
Dec 08 Javascript
详解webpack之scss和postcss-loader的配置
Jan 09 Javascript
vue实现选项卡及选项卡切换效果
Apr 24 Javascript
微信小程序 调用微信授权窗口相关问题解决
Jul 25 Javascript
js单线程的本质 Event Loop解析
Oct 29 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
截获网站title标签之家内容的例子
2006/10/09 PHP
用PHP的超级变量$_POST获取HTML表单(HTML Form) 数据
2011/05/07 PHP
php object转数组示例
2014/01/15 PHP
以文件形式缓存php变量的方法
2015/06/26 PHP
PHP获取昨天、今天及明天日期的方法
2016/02/03 PHP
PHP简单实现上一页下一页功能示例
2016/09/14 PHP
IE无法设置短域名下Cookie
2010/09/23 Javascript
动态加载script文件的两种方法
2013/08/15 Javascript
jquery提取元素里的纯文本不包含span等里的内容
2013/09/30 Javascript
使用jquery prev()方法找到同级的前一个元素
2014/07/11 Javascript
javascript格式化指定日期对象的方法
2015/04/21 Javascript
setTimeout内不支持jquery的选择器的解决方案
2015/04/28 Javascript
JS中innerHTML和pasteHTML的区别实例分析
2016/06/22 Javascript
jquery.multiselect多选下拉框实现代码
2016/11/11 Javascript
详解node.js平台下Express的session与cookie模块包的配置
2017/04/26 Javascript
打字效果动画的4种实现方法(超简单)
2017/10/18 Javascript
vue 实现单选框设置默认选中值
2019/11/07 Javascript
[03:24][TI9纪实] Dota奶爸
2019/08/22 DOTA
用TensorFlow实现lasso回归和岭回归算法的示例
2018/05/02 Python
python爬取网易云音乐评论
2018/11/16 Python
对python多线程中Lock()与RLock()锁详解
2019/01/11 Python
Python设计模式之代理模式实例详解
2019/01/19 Python
pytorch获取vgg16-feature层输出的例子
2019/08/20 Python
浅谈cv2.imread()和keras.preprocessing中的image.load_img()区别
2020/06/12 Python
雪花秀美国官方网站:韩国著名草本护肤化妆品品牌
2016/10/19 全球购物
Bibloo荷兰:女士、男士和儿童的服装、鞋子和配饰
2019/02/25 全球购物
亚洲领先的旅游体验市场:Voyagin
2019/11/23 全球购物
天逸系统(武汉)有限公司Java笔试题
2015/12/29 面试题
yy婚礼司仪主持词
2014/03/14 职场文书
党员民主生活会个人整改措施材料
2014/09/16 职场文书
以权谋私检举信范文
2015/03/02 职场文书
2015年大学班级工作总结
2015/04/28 职场文书
祝福语集锦:朋友新店开业祝福语
2019/12/10 职场文书
CocosCreator ScrollView优化系列之分帧加载
2021/04/14 Python
HTML中的表格元素介绍
2022/02/28 HTML / CSS
5个实用的JavaScript新特性
2022/06/16 Javascript