koa源码之delegate使用

Posted mrzhu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了koa源码之delegate使用相关的知识,希望对你有一定的参考价值。

koa中context可以直接调用request和response属性的重要原因是使用了delegate将req和res的属性代理到context,

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 setter `name`.
 *
 * @param {String} name
 * @return {Delegator} self
 * @api public
 */

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;
};

其中最核心的是__defineGetter__和__defineSetter__

在对象定义后给对象添加getter或setter方法要通过两个特殊的方法__defineGetter__和__defineSetter__。这两个函数要求第一个是getter或setter的名称,以string给出,第二个参数是作为getter或setter的函数。

例如我们给Date对象添加一个year属性:

Date.prototype.__defineGetter__(‘year‘, function() {return this.getFullYear();});     
Date.prototype.__defineSetter__(‘year‘, function(y) {this.setFullYear(y)});     

var now = new Date;     
alert(now.year);     
now.year = 2006;     
alert(now); 

  第二个地方是在初始化的时候:

function Delegator(proto, target) {
  if (!(this instanceof Delegator)) return new Delegator(proto, target);
  this.proto = proto;
  this.target = target;
  this.methods = [];
  this.getters = [];
  this.setters = [];
  this.fluents = []; 
}

  将proto和target保存起来,然后我们看到

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

当使用set设置属性的时候 实际上是设置了target的属性

 

以上是关于koa源码之delegate使用的主要内容,如果未能解决你的问题,请参考以下文章

Node进阶——之事无巨细手写Koa源码

手写Koa.js源码

Koa源码解读

从头实现一个koa框架

一步步去阅读koa源码,整体架构分析

结构型模式-安卓源码实战之的Proxy(代理)、Delegate(委托)