HarmonyOS 鸿蒙Next 使用自定义装饰器后,被装饰的方法中无法使用 this,this 变成了 undefined
HarmonyOS 鸿蒙Next 使用自定义装饰器后,被装饰的方法中无法使用 this,this 变成了 undefined
示例代码如下
export interface Options<T> {
errorReturn: T;
}
export function MyDecorator<T>(options: Options<T>) {
return (target: Object, key: string, descriptor: PropertyDescriptor) => {
if (canIUse('SystemCapability.ArkUI.ArkUI.Full')) {
const originalMethod: Function = descriptor.value;
descriptor.value = (...args: object[]):T => {
try {
return originalMethod(...args);
} catch (error) {
console.error(
`catch error:${JSON.stringify(error)} with target:${target.constructor.name} method:${key}
args:${JSON.stringify(args)}`
);
return options.errorReturn;
}
};
return descriptor;
} else {
return descriptor;
}
}
}
import { MyDecorator } from "./Decorator";
export class DecoratorTest {
result = 10;
constructor() {
}
[@MyDecorator](/user/MyDecorator)<number>({ errorReturn: 0 })
public doSomeThing(arg: string): number {
// 被装饰之后,使用 this 会出错
this.result = 11;
return this.result;
}
}
更多关于HarmonyOS 鸿蒙Next 使用自定义装饰器后,被装饰的方法中无法使用 this,this 变成了 undefined的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于HarmonyOS 鸿蒙Next 使用自定义装饰器后,被装饰的方法中无法使用 this,this 变成了 undefined的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,使用自定义装饰器后,被装饰的方法中this
变成undefined
的问题通常与装饰器如何改变方法的上下文绑定有关。在JavaScript及其衍生环境中(包括鸿蒙的JS开发框架),this
的指向依赖于函数被调用的方式。装饰器可能会改变原始方法的调用方式,从而导致this
指向不正确。
解决这类问题的一种常见方法是确保在装饰器内部正确绑定this
。如果装饰器内部使用了函数或方法调用,并且希望保持原始的this
上下文,可以通过使用.bind(this)
或者在箭头函数中调用原始方法(箭头函数不绑定自己的this
,会捕获其所在上下文的this
值)来解决。
例如,如果你的装饰器是这样写的:
function myDecorator(target, key, descriptor) {
const originalMethod = descriptor.value;
descriptor.value = function(...args) {
// 确保this指向正确
return originalMethod.apply(this, args);
};
return descriptor;
}
确保在调用originalMethod
时使用apply(this, args)
或者改为箭头函数并在其中直接调用originalMethod()
。
如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html