gpt4 book ai didi

Javascript 装饰器,检测上下文

转载 作者:行者123 更新时间:2023-12-02 13:43:22 26 4
gpt4 key购买 nike

我正在编写一些装饰器(工厂)函数,它们可以用作装饰器,也可以直接调用。如果它们安装到某个类/方法/属性/...或直接调用,那么最好以相同的方式调用它们。是否可以检测该函数是否被调用为装饰器或“普通”函数,而无需传递其他属性或调用工厂内的实际装饰器函数?

装饰器

export function DecoratorFactory(opts) {
// detect if it was called as a function
if(isFunctionCall) return 'Was called as function';

return (target, propertyKey, descriptor) => {
// do something
return descriptor;
};
}

使用

作为函数

DecoratorFactory({...}) === 'Was called as function';

作为装饰者

class Test {

@DecoratorFactory({...})
testDecorator() {
//modified function
}
}

谢谢

最佳答案

无法区分装饰器函数的调用,因为最终它只是被调用的函数。

同样,无法区分装饰器是在没有 (@DecoratorFactory testDecorator() ...) 的情况下指定的还是带有参数 (@DecoratorFactory(...) testDecorator() 的情况下指定的...)如果它们不能可靠地是鸭子类型的。

判断装饰器是否被直接调用的一种方法是按照惯例使用 new 调用它。这是有道理的,因为它已经遵循 PascalCase 命名约定并表明它是构造函数:

export function DecoratorFactory(opts) {
if(this instanceof DecoratorFactory)
// or for native ES6,
// if(new.target)
return 'Was called as function';

return (target, propertyKey, descriptor) => {
// do something
return descriptor;
};
}
例如,这是 Angular 中用于注释(装饰器)的配方;手动应用时需要使用 new 调用它们。

关于Javascript 装饰器,检测上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42805405/

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