最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

JavaScript装饰者模式

来源:动视网 责编:小采 时间:2020-11-27 20:26:19
文档

JavaScript装饰者模式

JavaScript装饰者模式:在传统的面向对象语言中,给对象添加功能常常使用继承的方式,但继承的方式会带来问题:当父类改变时,他的所有子类都将随之改变。 当JavaScript脚本运行时,在一个对象中(或他的原型上)增加行为会影响该对象的所有实例, 装饰者是一种实现继承的替代方案,
推荐度:
导读JavaScript装饰者模式:在传统的面向对象语言中,给对象添加功能常常使用继承的方式,但继承的方式会带来问题:当父类改变时,他的所有子类都将随之改变。 当JavaScript脚本运行时,在一个对象中(或他的原型上)增加行为会影响该对象的所有实例, 装饰者是一种实现继承的替代方案,


在传统的面向对象语言中,给对象添加功能常常使用继承的方式,但继承的方式会带来问题:当父类改变时,他的所有子类都将随之改变。

当JavaScript脚本运行时,在一个对象中(或他的原型上)增加行为会影响该对象的所有实例,

装饰者是一种实现继承的替代方案,它通过重载方法的形式添加新功能,该模式可以在被装饰者前面(before)或者后面(after)加上自己的行为以达到特定的目的。

装饰者模式是为已有功能动态地添加更多功能的一种方式,把每个要装饰的功能放在单独的函数里,然后用该函数包装所要装饰的已有函数对象,因此,当需要执行特殊行为的时候,调用代码就可以根据需要有选择地、按顺序地使用装饰功能来包装对象。优点是把类(函数)的核心职责和装饰功能区分开了。

我们可以定义工具函数,如下:

Function.prototype.before = function (beforeFn) {
 var self = this; //保存原函数的引用
 return function () { //返回包含了新函数和原函数的代理函数
 beforeFn.apply(this,arguments); //执行新函数,且保证this不被劫持
 return self.apply(this,arguments); //执行原函数,并返回原函数的执行结果,并保证this不被劫持
 }
};
Function.prototype.after = function (afterFn) {
 var self = this;
 return function () {
 var ret = self.apply(this,arguments);
 afterFn.apply(this,arguments);
 return ret;
 }
};

这里的参数beforeFn、afterFn即为要为原函数扩展新功能的新函数(添加装饰),它们的唯一区别是执行顺序的不同。如果不想污染Function的原型,可以用下面的方法:

var before = function (fn, beforeFn) {
 return function () {
 beforeFn.apply(this,arguments);
 return fn.apply(this,arguments);
 }
};
var after = function (fn, afterFn) {
 return function () {
 var ret = fn.apply(this,arguments);
 afterFn.apply(this,arguments);
 return ret;
 }
};

例子:给HTTP请求中带上一个参数防止CSRF攻击

var ajax = function (type, url, param) {
 console.log(param); //发送ajax请求代码略...
};
var beforeFn = function (type, url, param) {
 param.Token = 'Token';
};
ajax = ajax.before(beforeFn);
ajax('get','http://...com/userinfo',{name:'SuFa'});
//{ name: 'SuFa', Token: 'Token' }

通过给ajax函数动态装饰上Token参数,而不是直接在原函数上修改参数,保证了ajax函数仍然是一个纯净的函数,提高了它的可复用性,它可在无需做任何修改的情况下直接拿到别的项目中使用。

例子:表单验证(把验证输入和表单提交的代码分离开来,然后动态的把验证输入功能装饰到表单提交之前,这样一来,我们就可以把验证输入部分写成一个插件的形式,用在不同的项目中)

//验证输入函数
var validata = function () {
 if(username.value === ''){
 alert('用户名不能为空');
 return false;
 }
 if(password.value === ''){
 alert('密码不能为空');
 return false;
 }
};
//表单提交函数
var formSubmit = function () {
 var param = {
 username: username.value,
 password: password.value
 };
 ajax('http://xxx.com/login',param);
};
 
formSubmit = formSubmit.before(validata);
submitBtn.onclick = function(){
 formSubmit();
};

文档

JavaScript装饰者模式

JavaScript装饰者模式:在传统的面向对象语言中,给对象添加功能常常使用继承的方式,但继承的方式会带来问题:当父类改变时,他的所有子类都将随之改变。 当JavaScript脚本运行时,在一个对象中(或他的原型上)增加行为会影响该对象的所有实例, 装饰者是一种实现继承的替代方案,
推荐度:
标签: 装饰 模式 js
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top