# 其余模块做了什么

上一节我们讲到Object.create(context), 现在我们来看看context,request,response这些模块做了什么

# context

最后导出的context是一个Object类型,这个类型里有一些方法,比如onerrer,inspect之类

这一部分除了导出的对象外,更有意思的部分是下面的delegate,还记得我们的前置知识点一

这一部分的源码注释如下

delegate(proto, 'response') //当访问proto[以下属性]时,用proto.response[以下属性]回应
  .method('attachment') //method表示这类属性是函数
    // ...
  .access('status') //access表示这类属性可以可读可写
    // ...
  .getter('headerSent') //getter表示这类属性只读
1
2
3
4
5
6

这里的意思,其实就是当我们访问proto上面的方法或者属性,我们让proto.response上的同名属性或方法来回应这些访问, proto是什么,就是我们exports出去的那个模块,就是context

所以这一段意思就是,访问context上面某个属性,我们用context.response上的同名属性回应

你有没有想起来,我们在使用koa时,我们用ctx.body,但是body这个属性真的在ctx上吗? 接下来,我们来看看response这个模块

# response和request

request

request部分

response

response部分

这两张其实分别对应的就是我们访问一个网页时,request headersresponse headers的内容

然后,聪明可爱的你应该注意到了,在第二张图中,有(get) body,说明当我们访问ctx.body时候, 实际上,处理属性访问的是ctx.response.body.