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使用的主要内容,如果未能解决你的问题,请参考以下文章