请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

关于装饰器的疑问

老师,您好,看了这章有点小疑问,百思不得其解,controller那个装饰器,为啥symbolPrefix属性要放在原型上,为什么要添加在原型上,而切从头到尾都没看到movieController的实例化,只有Route类的实例化,难道Route实例化后,movieController也会跟着实例化么,为啥就可以用了

正在回答

2回答

symbolPrefix 只是一个路径的前缀,可以看做是以它为分隔的路径命名空间,它的作用,就是为了拼接出来 koa-router 所需要第一个匹配路由方法的路径: routerPath = prefixPath + conf.path


不需要实例化,能让 koa-router 认识这个 routerPath 就行了,这个 movieController 所在的文件被 require 进来的时候,也就是 target 的原型上就配置了作为命名空间的路径,而在接下来的执行中,movieController 里面的每一个方法,被作为路由中间件执行的时候,都会去拼接完整的路径地址。



0 回复 有任何疑惑可以回复我~
  • 提问者 开天辟地 #1
    symbolPrefix是前缀我能理解,关于这个实例化是不是require进来之后就被实例化了 呢?我这边是这么理解的,引入movieController这个模块,会执行了这个模块的所有调用的装饰器,类的所有方法和属性不都是在实例化之后才被激活的么
    回复 有任何疑惑可以回复我~ 2018-02-12 23:42:25
  • Scott 回复 提问者 开天辟地 #2
    你是卡在 “装饰器加工后的类,这个类(movieController)必须被实例化才能用” 这个认知上了,在整个 router 初始化的前前后后,并没有发生类实例化的事情,因为不需要它实例化,照样可以去读取它的原型链、属性、方法,我们所需要的,仅仅是借助于对类和类方法的装饰,来帮助我们生成一个(可以拼接完整路径)描述路由-控制器-中间件 映射的  routerMap,借助于类原型的能力,但并不需要对它实例化
    回复 有任何疑惑可以回复我~ 2018-02-13 09:55:52
  • 提问者 开天辟地 回复 Scott #3
    大概明白了,存在在原型上的属性,不需要实例化就可以访问,老师真是一言点醒梦中人呀,豁然开朗
    回复 有任何疑惑可以回复我~ 2018-02-13 11:25:18
godghdai 2018-02-12 23:41:01

controller装饰器传入的target为Constructor,

controller里面方法的装饰器传入的target为Constructor.prototype,

只有放在Constructor.prototype上的属性,在方法的装饰器上才能访问


0 回复 有任何疑惑可以回复我~
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信