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 相关文章推荐
jQuery 各种浏览器下获得日期区别
Dec 22 Javascript
JavaScript 设计模式之组合模式解析
Apr 09 Javascript
一个背景云变换js特效 鼠标移动背景云变化
Dec 28 Javascript
javascript使用正则获取url上的某个参数
Sep 04 Javascript
jQuery提示效果代码分享
Nov 20 Javascript
jQuery团购倒计时特效实现方法
May 07 Javascript
ashx文件获取$.ajax()方法发送的数据
May 26 Javascript
setTimeout学习小结
Feb 08 Javascript
angular4 共享服务在多个组件中数据通信的示例
Mar 30 Javascript
vue.js实现二级菜单效果
Oct 19 Javascript
详解Vue+elementUI build打包部署后字体图标丢失问题
Jul 13 Javascript
在antd Form表单中select设置初始值操作
Nov 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/11/22 PHP
php如何连接sql server
2015/10/16 PHP
微信获取用户地理位置信息的原理与步骤
2015/11/12 PHP
crontab无法执行php的解决方法
2016/01/25 PHP
微信红包随机生成算法php版
2016/07/21 PHP
js实现的跟随鼠标移动的时钟效果(中英文日期显示)
2011/01/17 Javascript
解决jquery异步按一定的时间间隔刷新问题
2012/12/10 Javascript
JS定时刷新页面及跳转页面的方法
2013/07/04 Javascript
JS使用replace()方法和正则表达式进行字符串的搜索与替换实例
2014/04/10 Javascript
jQuery中:button选择器用法实例
2015/01/04 Javascript
js实现遮罩层弹出框的方法
2015/01/15 Javascript
javascript常用功能汇总
2015/07/05 Javascript
浅析AMD CMD CommonJS规范--javascript模块化加载学习心得总结
2016/03/16 Javascript
5种JavaScript脚本加载的方式
2017/01/16 Javascript
Vue.js实现多条件筛选、搜索、排序及分页的表格功能
2020/11/24 Javascript
JavaScript通过改变文字透明度实现的文字闪烁效果实例
2017/04/27 Javascript
手淘flexible.js框架使用和源代码讲解小结
2018/10/15 Javascript
vue路由跳转传参数的方法
2019/05/06 Javascript
基于Vue SEO的四种方案(小结)
2019/07/01 Javascript
Vue单文件组件开发实现过程详解
2020/07/30 Javascript
Python中的Numpy入门教程
2014/04/26 Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
2017/07/27 Python
浅谈Python由__dict__和dir()引发的一些思考
2017/10/30 Python
python中int与str互转方法
2018/07/02 Python
python数据结构学习之实现线性表的顺序
2018/09/28 Python
Python3.5 Pandas模块缺失值处理和层次索引实例详解
2019/04/23 Python
在python中创建指定大小的多维数组方式
2019/11/28 Python
python连接PostgreSQL过程解析
2020/02/09 Python
python3通过qq邮箱发送邮件以及附件
2020/05/20 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
2020/12/05 Python
python网络爬虫实现发送短信验证码的方法
2021/02/25 Python
亚马逊中国官方网站:amazon.cn
2017/05/25 全球购物
手工制作的音乐盒:Music Box Attic
2019/09/05 全球购物
完美的中文自荐信
2014/05/24 职场文书
期末个人总结范文
2015/02/13 职场文书
python中sys模块的介绍与实例
2021/04/17 Python