[JavaScript] 装饰器修改函数时怎么保证this的指向不变

发布于 2022-09-04 00:26:14 字数 1084 浏览 27 评论 0

memorizerDecorator(resolver?: Function) {
    let cache = new Map<any, any>();
    resolver = resolver || function (args: Array<any>) {
        return args[0];
    };

    return (target, propertyKey: string, descriptor: PropertyDescriptor) => {
        const method: Function = descriptor.value;

        descriptor.value = function (...args) {
            const key = resolver(args);
            if (!cache.has(key)) {
                cache.set(key, method.bind(target)(...args));
            }

            return cache.get(key);
        };
        descriptor.value.resetCache = () => {
            cache = new Map<any, any>();
        };
        descriptor.value.getCache = () => {
            return cache;
        };

        return descriptor;
    };
}

class F {
    w = 1;
    
    @memorizerDecorator()
    fib3(n) {
        console.log(this.w);
        if (n === 0 || n === 1) {
            return n;
        }
        return this.fib3(n - 1) + this.fib3(n - 2);
    }
}

修改后的方法怎么才能访问到原来的this.w么

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

深空失忆 2022-09-11 00:26:14

bind?
es6 的()=>{}是自动bind的吧。。。

自由范儿 2022-09-11 00:26:14

你好,你的问题解决了吗 我也遇到这个问题了 在原来的实例方法中访问不到this了

眼泪都笑了 2022-09-11 00:26:14

descriptor.value = function(this:any, ..._args: any[]){}
this就是class F的this

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文