对于装饰器,还是有点不明白

来源:7-1 利用 Decorator 重构 Koa 路由策略

mylovef

2017-08-08

http://coding.imooc.com/learn/questiondetail/19588.html 

这个问题下,非常感谢老师的详细解答,我基本上已经弄清楚了

但还是有个问题,我仔细翻了修饰器的相关文档,得出的是修饰的是方法那target就是这个类的实例对象,之前老师的回答里面

conf 对应到的就是

{ target: pagesController { [Symbol(prefix)]: 'api/v0' },

  method: 'get',
  path: '/login' }


http://szimg.mukewang.com/59896b830001684208260256.jpg但在代码里面

通过后面的get/post等方法,router是用来修饰类内部的方法属性的,

通过export const controller = path => target => target.prototype[symbolPrefix] = path

controller传入的path被传递到了target.prototype[symbolPrefix] 上,也就是老师例子中的 pagesController.prototype[symbolPrefix] 

在例子中就能得出 pagesController.prototype[symbolPrefix] : 'api/v0'----------------------------------1

而实例装饰器中,也就是router中的target原本应该是pagesController.prototype-------------------------2


那问题来了,根据1和2 怎么得出这里的target是: pagesController { [Symbol(prefix)]: 'api/v0'呢

写回答

1回答

Scott

2017-08-13

看了 3 遍这个问题,没有太懂。


target 分两层,第一层可以理解为命名空间,也就是 controller = path => target 这一层,我们锁定比如 '/api/v0' 是命名空间,第二层是具体到某个路由路径的 Map 映射,也就是 get = path => router({}) 进而进入到 routersMap.set({  target: target 这一层,先执行第一层,后执行第二层,最终实现了:

我们在 /api/v0 下面可以继续增加  a b 来对外暴露 /api/v0/a    /api/v0/b 这样的路由。


让我们可以基于第一层的 controller 命名空间路由,配置到更深一层的路由,是通过 decorator 装饰器实现的,这两层路由中的 target 是不同路由层次时候的 target


0
1
mylovef
非常感谢!
2017-08-15
共1条回复

开发微信全家桶项目Vue/Node/MongoDB高级技术栈全覆盖

Nuxt/Vue SSR + Koa2 跨栈开发微信公众号+小程序

989 学习 · 401 问题

查看课程