gpt4 book ai didi

javascript - 装饰器 : "this" is undefined when accessed in descriptor. 值

转载 作者:行者123 更新时间:2023-11-30 11:10:43 27 4
gpt4 key购买 nike

我正在尝试装饰器,我写了一个装饰器,它基本上返回一个执行一些 `console.log 的新函数。

这是我的装饰器的样子:

function test(target, name, descriptor) {
const original = descriptor.value;
console.log("bbau");
if (typeof original === 'function') {
descriptor.value = function (...args) {
console.log(`Arguments: ${args}`);
try {
console.log("executing");
const result = original.apply(this, args);
console.log("done");
console.log(`Result: ${result}`);
return result;
} catch (e) {
console.log(`Error: ${e}`);
throw e;
}
}
}
return descriptor;
}

这就是我使用它的方式:

class TestController extends BaseController<//..> {
// ...
@test
testIt(req: Request, res: Response) : Response {
this.sendResponse();
}

sendResponse(options: ISendResponseOptions, res: Response) : Response {
// return response
}
}

``但是,执行时会出现错误:Error: TypeError: Cannot read property 'sendResponse' of undefined

有什么想法吗?谢谢!

最佳答案

当您想从声明函数的上下文中捕获 this 时(或者当 this 无关紧要时),您通常应该使用箭头函数。在这种情况下,您确实希望 this 成为函数被调用的对象,因此您应该使用常规函数:

const test = (target, name, descriptor) => {
const original = descriptor.value;
if (typeof original === 'function') {
descriptor.value = function (...args) {
console.log(`Arguments: ${args}`);
try {
console.log("executing");
const result = original.apply(this, args);
console.log("done");
console.log(`Result: ${result}`);
return result;
} catch (e) {
console.log(`Error: ${e}`);
throw e;
}
}
}
return descriptor;
}

您可以在 playground 中进行测试

如果您将此函数用作另一个函数的参数,您还应该调用 bind 为该函数设置 this(否则调用者将确定 这个):

router.route("/").post(testController.testIt.bind(testController))

关于javascript - 装饰器 : "this" is undefined when accessed in descriptor. 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53856135/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com