HarmonyOS 修饰器是否可以被重写,或者是自定义修饰器?

HarmonyOS 修饰器是否可以被重写,或者是自定义修饰器?

HarmonyOS
2024-10-29 11:55:44
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
superinsect

​在ets文件中定义装饰器,则需要同时满足ArkTS的语法规则,比如不能使用any等。

以下是类装饰器、属性装饰器、方法装饰器、参数装饰器的简单示例,以供参考:​

function TestClassDecorator (target: Function) {}  
function TestMemberDecorator (target: testClass, memberName: String) {}  
function TestFunDecorator (target: testClass, propertyName: String, descriptor: PropertyDescriptor) {}  
function TestArgDecorator (target: Function, methodName: String, paramIndex: Number) {}  
  
@TestClassDecorator  
class testClass {  
  @TestMemberDecorator  
  count: number = 123;  
  
  @TestFunDecorator  
  TestFun(@TestArgDecorator param: string) {}  
}

通过以下方法举例:

function logger(target: Object, propertyKey: string, descriptor: PropertyDescriptor) {  
  const originalMethod: Function = descriptor.value  
  console.log('WyTest-- name: ', propertyKey);  
  descriptor.value = (...args: Object[]) => {  
    console.log('WyTest-- params: ', ...args);  
    const result: Object = originalMethod(...args);  
    console.log('WyTest-- result: ', result);  
    return result;  
  }  
  return descriptor  
}  
class MathClass {  
  prop:number = 0;  
  static staticProp = 1;  
  @logger  
  add(x: number, y: number) {  
    return x + y;  
  }  
  @logger  
  static staticSub(x: number, y: number) {  
    return x - y;  
  }  
}  
@Entry  
@Component  
struct DecoratorFunction {  
  @State message: string = 'Hello World';  
  build() {  
    Row() {  
      Column() {  
        Text(this.message)  
          .fontSize(50)  
          .fontWeight(FontWeight.Bold)  
          .onClick(() => {  
            const c: MathClass = new MathClass();  
            c.add(1, 2);  
            MathClass.staticSub(5, 2)  
          })  
      }  
      .width('100%')  
    }  
    .height('100%')  
  }  
}

​上面例子中我们使用了自定义装饰器中的方法装饰器,其中装饰器有三个入参:target、propertyKey、descriptor

其含义分别如下:

target: 对于静态成员来说是类的构造函数,对于实例成员是类的原型对象。

每个实例对象( object )都有一个私有属性(称之为 _proto_ )指向它的构造函数的原型对象(prototype)。

该原型对象也有一个自己的原型对象( _proto_ ) ,层层向上直到一个对象的原型对象为 null。对于target,对于不同类型的静态/实例成员,装饰器获取到的值有所不同

propertyKey: 是方法的名称。

descriptor: 是方法的描述 修饰方法。通过这个参数我们可以修改方法原本的实现,添加一些共用逻辑。 例如我们可以给一些方法添加打印输入与输出的能力。​

分享
微博
QQ
微信
回复
2024-10-29 17:31:46
相关问题
HarmonyOS 是否支持自定义装饰
188浏览 • 1回复 待解决
是否支持自定义装饰
2028浏览 • 1回复 待解决
ArkTS是否支持自定义装饰
2302浏览 • 1回复 待解决
HarmonyOS " @State可以修饰ArrayList吗"
303浏览 • 1回复 待解决
HarmonyOS video空间自定义控制
214浏览 • 1回复 待解决
自定义装饰的使用问题
699浏览 • 1回复 待解决
自定义日期滑动选择弹窗
332浏览 • 1回复 待解决
HarmonyOS 自定义装饰不能作用于ets
267浏览 • 1回复 待解决
返回按钮是否可以自定义事件?
159浏览 • 1回复 待解决
CounterComponent的样式是否可以自定义
170浏览 • 1回复 待解决
是否可以自定义权限弹框文字
1609浏览 • 1回复 待解决
怎样实现一个自定义播放
285浏览 • 1回复 待解决