javascript - 《ES6标准入门》中关于修饰器的疑问
问题描述
修饰器对类的行为的改变,是代码编译时发生的,而不是在运行时。这意味着,修饰器能在编译阶段运行代码。也就是说,修饰器本质就是编译时执行的函数。
有以下几个问题:
上面引用中说到:修饰器对类的行为的改变,是代码编译时发生的,而不是在运行时,这句中的编译时、运行时、发生分别是什么意思?
修饰器本质就是编译时执行的函数,这里的执行和问题一中的发生是一个意思吗?
修饰器一般用在哪些地方?
书上的解释看的比较模糊,麻烦大神细细解说,非常感谢!
问题解答
回答1:编译时,可以大致理解为,在代码开始运行之前,JS引擎将代码转化成机器可以运行的操作的时候。也就是说,这个过程无法在运行时候加以干涉的,因为它在开始运行之前就已经完成了。
而运行时,则是指你代码编译以后机器可以运行的操作开始运行时,也就是你写的那些东西,从机器操作变成了你能实际在电脑上看到的东西的时候。
至于发生,并没有特殊含义,就是指这些改变是在JS引擎将代码转化为机器操作过程中完成的。
执行和发生,大致可以认为是因和果的关系。改变,一般搭配的动词是“发生”,函数,一般搭配的词是“执行”。发生强调的是前后状态的对比,也就是说,因为发生了某件事,导致之后和之前不同了。而执行则侧重过程,执行一个操作,也就是将操作里每个步骤都做一遍,并没有刻意去注重前后是否有不同。所以,这边应该是修饰器=编译时执行的函数,这个函数执行之后导致的结果是类行为有所改变。
既然,上面说了,是对类行为的改变,所以修饰器一般用在类声明时候对类里面方法和属性的修饰。
回答2:说白了,代码大体分编译阶段和运行阶段,你可以理解成编译阶段把代码解析成一个树,到了运行阶段时,按照编译形成的树进行运行。你可以在github上搜索一下core-decorators.js,这个库就是一个修饰器的实例。
相关文章:
1. $fields = $values = [];这条代码一直定义不了,一直报错,老师的源码也是被报错的,执行不了,请问该怎么解决这个问题2. python - 求一个在def中可以实现调用本def满足特定条件continue效果的方法(标题说不太清楚,请见题内描述)3. angular.js - angularjs的自定义过滤器如何给文字加颜色?4. javascript - 用表单提交两个时间段请求后台返回对应数据时出现的一些问题!5. java - mybatis怎么实现在数据库中有就修改,没有就添加6. 正则表达式 - python pandas的sep参数问题7. docker内创建jenkins访问另一个容器下的服务器问题8. MYSQL新建用户设置可以远程访问的问题9. mysql - SQL操作时间的函数?10. docker api 开发的端口怎么获取?
![$fields = $values = [];这条代码一直定义不了,一直报错,老师的源码也是被报错的,执行不了,请问该怎么解决这个问题](http://www.haobala.com/attached/image/news/202205/093622cb60.png)