对于装饰器,还是有点不明白
来源: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' }
但在代码里面
通过后面的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回答
-
看了 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
012017-08-15
相似问题