Skip to content

Commit 66e421f

Browse files
committed
docs(decorator): edit decorator
1 parent 7e08e9f commit 66e421f

File tree

1 file changed

+43
-22
lines changed

1 file changed

+43
-22
lines changed

docs/decorator.md

Lines changed: 43 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,7 @@ class A {}
3131
A = decorator(A) || A;
3232
```
3333

34-
注意,修饰器对类的行为的改变,是代码编译时发生的,而不是在运行时。这意味着,修饰器能在编译阶段运行代码。也就是说,修饰器本质就是编译时执行的函数。
35-
36-
修饰器函数的第一个参数,就是所要修饰的目标类。
34+
也就是说,修饰器是一个对类进行处理的函数。修饰器函数的第一个参数,就是所要修饰的目标类。
3735

3836
```javascript
3937
function 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
527547
export function mixins(...list) {
@@ -547,9 +567,9 @@ let obj = new MyClass();
547567
obj.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
555575
class 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
639659
import { traits } from 'traits-decorator';
@@ -654,9 +674,9 @@ obj.foo() // foo
654674
obj.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
662682
import { 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
686706
import { traits, excludes } from 'traits-decorator';
@@ -702,9 +722,9 @@ obj.foo() // foo
702722
obj.bar() // bar
703723
```
704724

705-
上面代码使用绑定运算符(::)在TBar上排除foo方法,混入时就不会报错了。
725+
上面代码使用绑定运算符(::)`TBar`上排除`foo`方法,混入时就不会报错了。
706726

707-
另一种方法是为TBar的foo方法起一个别名
727+
另一种方法是为`TBar``foo`方法起一个别名
708728

709729
```javascript
710730
import { traits, alias } from 'traits-decorator';
@@ -727,27 +747,27 @@ obj.aliasFoo() // foo
727747
obj.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'}))
736756
class 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'}}))
745765
class 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
771791
babel.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

Comments
 (0)