@@ -31,9 +31,7 @@ class A {}
3131A = decorator (A ) || A ;
3232```
3333
34- 注意,修饰器对类的行为的改变,是代码编译时发生的,而不是在运行时。这意味着,修饰器能在编译阶段运行代码。也就是说,修饰器本质就是编译时执行的函数。
35-
36- 修饰器函数的第一个参数,就是所要修饰的目标类。
34+ 也就是说,修饰器是一个对类进行处理的函数。修饰器函数的第一个参数,就是所要修饰的目标类。
3735
3836``` javascript
3937function testable (target ) {
@@ -63,6 +61,8 @@ MyClass.isTestable // false
6361
6462上面代码中,修饰器` testable ` 可以接受参数,这就等于可以修改修饰器的行为。
6563
64+ 注意,修饰器对类的行为的改变,是代码编译时发生的,而不是在运行时。这意味着,修饰器能在编译阶段运行代码。也就是说,修饰器本质就是编译时执行的函数。
65+
6666前面的例子是为类添加一个静态属性,如果想添加实例属性,可以通过目标类的` prototype ` 对象操作。
6767
6868``` javascript
@@ -226,6 +226,26 @@ class Person {
226226
227227从上面代码中,我们一眼就能看出,` Person ` 类是可测试的,而` name ` 方法是只读和不可枚举的。
228228
229+ 下面是使用 Decorator 写法的[ 组件] ( https://github.com/ionic-team/stencil ) ,看上去一目了然。
230+
231+ ``` javascript
232+ @Component ({
233+ tag: ' my-component' ,
234+ styleUrl: ' my-component.scss'
235+ })
236+ export class MyComponent {
237+ @Prop () first: string;
238+ @Prop () last: string;
239+ @State () isVisible: boolean = true ;
240+
241+ render () {
242+ return (
243+ < p> Hello, my name is {this .first } {this .last }< / p>
244+ );
245+ }
246+ }
247+ ```
248+
229249如果同一个方法有多个修饰器,会像剥洋葱一样,先从外到内进入,然后由内向外执行。
230250
231251``` javascript
@@ -521,7 +541,7 @@ obj.foo() // 'foo'
521541
522542上面代码之中,对象` Foo ` 有一个` foo ` 方法,通过` Object.assign ` 方法,可以将` foo ` 方法“混入”` MyClass ` 类,导致` MyClass ` 的实例` obj ` 对象都具有` foo ` 方法。这就是“混入”模式的一个简单实现。
523543
524- 下面,我们部署一个通用脚本` mixins.js ` ,将mixin写成一个修饰器 。
544+ 下面,我们部署一个通用脚本` mixins.js ` ,将 Mixin 写成一个修饰器 。
525545
526546``` javascript
527547export function mixins (... list ) {
@@ -547,9 +567,9 @@ let obj = new MyClass();
547567obj .foo () // "foo"
548568```
549569
550- 通过mixins这个修饰器,实现了在MyClass类上面 “混入”Foo对象的 ` foo ` 方法。
570+ 通过 ` mixins ` 这个修饰器,实现了在 ` MyClass ` 类上面 “混入”` Foo ` 对象的 ` foo ` 方法。
551571
552- 不过,上面的方法会改写` MyClass ` 类的` prototype ` 对象,如果不喜欢这一点,也可以通过类的继承实现mixin 。
572+ 不过,上面的方法会改写` MyClass ` 类的` prototype ` 对象,如果不喜欢这一点,也可以通过类的继承实现 Mixin 。
553573
554574``` javascript
555575class MyClass extends MyBaseClass {
@@ -631,9 +651,9 @@ new C().foo()
631651
632652## Trait
633653
634- Trait也是一种修饰器,效果与Mixin类似 ,但是提供更多功能,比如防止同名方法的冲突、排除混入某些方法、为混入的方法起别名等等。
654+ Trait 也是一种修饰器,效果与 Mixin 类似 ,但是提供更多功能,比如防止同名方法的冲突、排除混入某些方法、为混入的方法起别名等等。
635655
636- 下面采用[ traits-decorator] ( https://github.com/CocktailJS/traits-decorator ) 这个第三方模块作为例子。这个模块提供的traits修饰器 ,不仅可以接受对象,还可以接受ES6类作为参数 。
656+ 下面采用[ traits-decorator] ( https://github.com/CocktailJS/traits-decorator ) 这个第三方模块作为例子。这个模块提供的 ` traits ` 修饰器 ,不仅可以接受对象,还可以接受 ES6 类作为参数 。
637657
638658``` javascript
639659import { traits } from ' traits-decorator' ;
@@ -654,9 +674,9 @@ obj.foo() // foo
654674obj .bar () // bar
655675```
656676
657- 上面代码中,通过traits修饰器 ,在` MyClass ` 类上面“混入”了` TFoo ` 类的` foo ` 方法和` TBar ` 对象的` bar ` 方法。
677+ 上面代码中,通过 ` traits ` 修饰器 ,在` MyClass ` 类上面“混入”了` TFoo ` 类的` foo ` 方法和` TBar ` 对象的` bar ` 方法。
658678
659- Trait不允许 “混入”同名方法。
679+ Trait 不允许 “混入”同名方法。
660680
661681``` javascript
662682import { traits } from ' traits-decorator' ;
@@ -678,9 +698,9 @@ class MyClass { }
678698// Error: Method named: foo is defined twice.
679699```
680700
681- 上面代码中,TFoo和TBar都有foo方法,结果traits修饰器报错 。
701+ 上面代码中,` TFoo ` 和 ` TBar ` 都有 ` foo ` 方法,结果 ` traits ` 修饰器报错 。
682702
683- 一种解决方法是排除TBar的foo方法 。
703+ 一种解决方法是排除 ` TBar ` 的 ` foo ` 方法 。
684704
685705``` javascript
686706import { traits , excludes } from ' traits-decorator' ;
@@ -702,9 +722,9 @@ obj.foo() // foo
702722obj .bar () // bar
703723```
704724
705- 上面代码使用绑定运算符(::)在TBar上排除foo方法 ,混入时就不会报错了。
725+ 上面代码使用绑定运算符(::)在 ` TBar ` 上排除 ` foo ` 方法 ,混入时就不会报错了。
706726
707- 另一种方法是为TBar的foo方法起一个别名 。
727+ 另一种方法是为 ` TBar ` 的 ` foo ` 方法起一个别名 。
708728
709729``` javascript
710730import { traits , alias } from ' traits-decorator' ;
@@ -727,27 +747,27 @@ obj.aliasFoo() // foo
727747obj .bar () // bar
728748```
729749
730- 上面代码为TBar的foo方法起了别名aliasFoo,于是MyClass也可以混入TBar的foo方法了 。
750+ 上面代码为 ` TBar ` 的 ` foo ` 方法起了别名 ` aliasFoo ` ,于是 ` MyClass ` 也可以混入 ` TBar ` 的 ` foo ` 方法了 。
731751
732- alias和excludes方法 ,可以结合起来使用。
752+ ` alias ` 和 ` excludes ` 方法 ,可以结合起来使用。
733753
734754``` javascript
735755@traits (TExample:: excludes (' foo' ,' bar' ):: alias ({baz: ' exampleBaz' }))
736756class MyClass {}
737757```
738758
739- 上面代码排除了TExample的foo方法和bar方法,为baz方法起了别名exampleBaz 。
759+ 上面代码排除 ` 了TExample ` 的 ` foo ` 方法和 ` bar ` 方法,为 ` baz ` 方法起了别名 ` exampleBaz ` 。
740760
741- as方法则为上面的代码提供了另一种写法 。
761+ ` as ` 方法则为上面的代码提供了另一种写法 。
742762
743763``` javascript
744764@traits (TExample:: as ({excludes: [' foo' , ' bar' ], alias: {baz: ' exampleBaz' }}))
745765class MyClass {}
746766```
747767
748- ## Babel转码器的支持
768+ ## Babel 转码器的支持
749769
750- 目前,Babel转码器已经支持Decorator 。
770+ 目前,Babel 转码器已经支持 Decorator 。
751771
752772首先,安装` babel-core ` 和` babel-plugin-transform-decorators ` 。由于后者包括在` babel-preset-stage-0 ` 之中,所以改为安装` babel-preset-stage-0 ` 亦可。
753773
@@ -763,12 +783,13 @@ $ npm install babel-core babel-plugin-transform-decorators
763783}
764784```
765785
766- 这时,Babel就可以对Decorator转码了 。
786+ 这时,Babel 就可以对 Decorator 转码了 。
767787
768788脚本中打开的命令如下。
769789
770790``` javascript
771791babel .transform (" code" , {plugins: [" transform-decorators" ]})
772792```
773793
774- Babel的官方网站提供一个[ 在线转码器] ( https://babeljs.io/repl/ ) ,只要勾选Experimental,就能支持Decorator的在线转码。
794+ Babel 的官方网站提供一个[ 在线转码器] ( https://babeljs.io/repl/ ) ,只要勾选 Experimental,就能支持 Decorator 的在线转码。
795+
0 commit comments