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 相关文章推荐
如何取得中文输入的真实长度?
Jun 24 Javascript
使用Javascript和DOM Interfaces来处理HTML
Oct 09 Javascript
超轻量级的基于jquery的三级展开列表
Apr 26 Javascript
JavaScript Sort 的一个错误用法示例
Mar 20 Javascript
node.js+express制作网页计算器
Jan 17 Javascript
EasyUI学习之DataGird分页显示数据
Dec 29 Javascript
动态加载css方法实现和深入解析
Jan 18 Javascript
JS库之wow.js使用方法
Sep 14 Javascript
关于axios不能使用Vue.use()浅析
Jan 12 Javascript
JS加密插件CryptoJS实现的DES加密示例
Aug 16 Javascript
微信小程序开发中var that =this的用法详解
Jan 18 Javascript
vue3.0自定义指令(drectives)知识点总结
Dec 27 Vue.js
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
收音机指标测试方法及仪器
2021/03/01 无线电
ubuntu10.04配置 nginx+php-fpm模式的详解
2013/06/03 PHP
php数组删除元素示例
2014/03/21 PHP
php使用array_rand()函数从数组中随机选择一个或多个元素
2014/04/28 PHP
Yii2 如何在modules中添加验证码的方法
2017/06/19 PHP
js自动查找select下拉的菜单并选择(示例代码)
2014/02/26 Javascript
如何正确使用Nodejs 的 c++ module 链接到 OpenSSL
2014/08/03 NodeJs
javascript实现百度地图鼠标滑动事件显示、隐藏
2015/04/02 Javascript
js编写贪吃蛇的小游戏
2020/08/24 Javascript
简述Matlab中size()函数的用法
2016/03/20 Javascript
Bootstrap3制作图片轮播效果
2016/05/12 Javascript
基于Javascript实现文件实时加载进度的方法
2016/10/12 Javascript
Node.js Express 框架 POST方法详解
2017/01/23 Javascript
JS实现移动端触屏拖拽功能
2018/07/31 Javascript
javascript数据结构之多叉树经典操作示例【创建、添加、遍历、移除等】
2018/08/01 Javascript
JavaScript实现轮播图特效
2020/04/10 Javascript
AutoJs实现刷宝短视频的思路详解
2020/05/22 Javascript
vue3.0中使用element的完整步骤
2021/03/04 Vue.js
[01:09:20]NB vs NAVI Supermajor小组赛A组 BO3 第二场 6.2
2018/06/03 DOTA
详解在Python和IPython中使用Docker
2015/04/28 Python
Python序列操作之进阶篇
2016/12/08 Python
python3.6+django2.0开发一套学员管理系统
2018/03/03 Python
Python中fnmatch模块的使用详情
2018/11/30 Python
OpenCV图像颜色反转算法详解
2019/05/13 Python
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
2019/10/11 Python
Python实现JS解密并爬取某音漫客网站
2020/10/23 Python
奥地利票务门户网站:oeticket.com
2019/12/31 全球购物
厨房工作人员岗位职责
2013/11/15 职场文书
求职毕业生自荐书
2014/02/08 职场文书
2014年外贸业务员工作总结
2014/12/11 职场文书
乌镇导游词
2015/02/02 职场文书
投资公司董事长岗位职责
2015/04/16 职场文书
学校元旦晚会开场白
2015/05/29 职场文书
教师考核鉴定意见
2015/06/05 职场文书
生产设备维护保养制度
2015/08/06 职场文书
docker compose 部署 golang 的 Athens 私有代理问题
2022/04/28 Servers