装饰器 TypeScript 官网API https://www.tslang.cn/docs/home.html
@property 也是 cocoecreator自带的装饰器类 所以下面就可以用 set SortingOrder(order: LayerOrder) {}来接收枚举类型了
@property({ visible: false })
private sortingOrder: LayerOrder = LayerOrder.Normal;
@property({ type: cc.Enum(LayerOrder), displayName: "显示层级" })
set SortingOrder(order: LayerOrder) {
this.sortingOrder = order
if (CC_EDITOR) {
let comp = this.node.getComponent(LayerExtend)
if (order === LayerOrder.Scene) {
if (!comp) {
comp = this.node.addComponent(LayerExtend)
}
this._adapterScreen = true
} else {
if (comp) {
this.node.removeComponent(LayerExtend)
}
this._adapterScreen = false
}
if (order >= LayerOrder.Model && order < LayerOrder.Scene) {
this._isModelLayer = true
this._blurBack = true
this._clickToClose = true
this._enableShowAnimation = true
this._enableHideAnimation = true
}
else if (order === LayerOrder.Normal) {
this._blurBack = false
this._isModelLayer = false
this._enableShowAnimation = false
this._enableHideAnimation = false
}
}
}
get SortingOrder() {
return this.sortingOrder
}
//************************** 调试 ********************************//
创建一个test.ts脚本
吧代码放到 test.ts 脚本里面
在终端(T) 新终端里运行 tsc test.ts --experimentalDecorators 可以把test.ts 生成test.js
在终端(T) 新终端里运行 node test.js 运行出test.js 的 代码输出结果
//有return 的时候,返回的就是 **重写了** @装饰器 下面所修饰的方法 ,
//@在类前面就是修饰return **重写了** 构造方法
//如果没有 return 就是自己单独的一个装饰器方法
//************************** 装饰器是一种特殊类型的声明 ********************************//
装饰器是一种特殊类型的声明,它能够被附加到类声明,方法,属性或参数上,可以修改类的行为。
-
通俗的讲装饰器就是一个方法,可以注入到类、方法、属性参数上来扩展类、属性、方法、参数的功能。
-
常见的装饰器有:类装饰器、属性装饰器、方法装饰器、参数装饰器、访问器装饰器
-
装饰器的写法:普通装饰器(无法传参) 、 装饰器工厂(可传参)
-
装饰器是过去几年中js最大的成就之一,已是Es7的标准特性之一
类装饰器
类装饰器在类声明之前被声明(紧靠着类声明)。
类装饰器 应用于 类构造函数,
可以用来监视,修改或替换类定义。
- 普通装饰器(无法传参)
function logClass(target:any){ console.log(target); // target 就是当前类 target.prototype.apiUrl='动态扩展的属性'; target.prototype.run=function(){ console.log('我是一个run方法'); } } @logClass//后面不可以加分号 class HttpClient{ constructor(){ } getData(){ } } var http:any=new HttpClient(); console.log(http.apiUrl); http.run();
//运行结果
[Function: HttpClient]
动态扩展的属性
我是一个run方法
```
- 装饰器工厂(可传参)
function logClass(params:string){ return function(target:any){ //有return 的时候,返回的就是 **重写了** @装饰器 下面所修饰的方法 , //@在类前面就是修饰return **重写了** 构造方法 //如果没有 return 就是自己单独的一个装饰器方法 console.log(target);//类Client console.log(params);//传进来的参 target.prototype.apiUrl=params; } } @logClass('hellow')//后面不可以加分号 class HttpClient{ constructor(){ } getData(){ } } var http:any=new HttpClient(); console.log(http.apiUrl);
//运行结果
[Function: HttpClient]
hellow
hellow
```
- 重载构造函数
function logClz(target:any) { return class extends target { url = 'change url'