为了账号安全,请及时绑定邮箱和手机立即绑定

从TJ大神源码中学习代理模式

标签:
前端工具

我们知道koa中有个context对象,context表示请求的上下文。今天在看这段代码的时候,发现了tjgit自己写的一个代理模式,觉得不错,记录一下。

地址:[delegates源码]https://github.com/tj/node-delegates/blob/master/index.js

设计模式中的代理模式是什么意思呢?

代理可以简单理解为:

为其他对象提供一种代理以控制对这个对象的访问。

context其实是responserequest的代理,将两者的一些方法注册到context上,这样通过context就可以访问到请求的上下文。

看看源码:

function Delegator(proto, target) {  // 这样写是为了兼容直接调用delegate(proto, 'response')
  // 这样也能返回一个对象
  if (!(this instanceof Delegator)) return new Delegator(proto, target);  // 工厂模式注册各种方法
  this.proto = proto;  this.target = target;  this.methods = [];  this.getters = [];  this.setters = [];  this.fluents = [];
}

method方法

Delegator.prototype.method = function(name){  var proto = this.proto;  var target = this.target;  this.methods.push(name);

  proto[name] = function(){    // 通过apply将this绑定到原对象,使用当前参数
    return this[target][name].apply(this[target], arguments);
  };  return this;
};

getter和setter:

Delegator.prototype.getter = function(name){  var proto = this.proto;  var target = this.target;  this.getters.push(name);

  proto.__defineGetter__(name, function(){    return this[target][name];
  });  return this;
};

Delegator.prototype.setter = function(name){  var proto = this.proto;  var target = this.target;  this.setters.push(name);

  proto.__defineSetter__(name, function(val){    return this[target][name] = val;
  });  return this;
};

用法:

delegate(proto, 'response')
  .method('attachment')
  .method('redirect')
  .method('remove')
  .method('vary')
  .method('set')
  .method('append')
  .method('flushHeaders')

tj代码,就是程序员的教科书



作者:陈小俊先生
链接:https://www.jianshu.com/p/7f2f45f9e6c9


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消