美文网首页
typeScript Decorators 的this作用域

typeScript Decorators 的this作用域

作者: 涅槃快乐是金 | 来源:发表于2019-07-29 11:26 被阅读0次
class FooBar {
    @log
    public foo(arg): void { 
        console.log(this);
        this.bar(arg);
    }
    @log
    private bar(arg) : void { 
        console.log(this, "bar", arg);
    }
}
function log(target: Function, key: string, value: any) {
    return {
        value: (...args: any[]) => {
            var a = args.map(a => JSON.stringify(a)).join();
            var result = value.value.apply(this, args); // How to avoid hard coded this?
            var r = JSON.stringify(result);
            console.log(`Call: ${key}(${a}) => ${r}`);
            return result;
        }
    };
}

这个时候会提示Uncaught TypeError: this.bar is not a function.
这是由于log中使用了箭头函数,改变了方法的作用域。this对象指向的是当前函数的上下文,而不是调用log方法的this对象。这边不要使用箭头函数

function log(target: Object, key: string, value: any) {
    return {
        value: function(...args: any[]) {
            var a = args.map(a => JSON.stringify(a)).join();
            var result = value.value.apply(this, args);
            var r = JSON.stringify(result);
            console.log(`Call: ${key}(${a}) => ${r}`);
            return result;
        }
    };
}

建议编辑descriptor/value 参数作为返回值。因此我们暂存了 descriptor 中当前value,避免覆盖其他注解对这个 descriptor 可能的修改。

function log(target: Object, key: string, descriptor: TypedPropertyDescriptor<any>) {
    var originalMethod = descriptor.value;

    descriptor.value = function(...args: any[]) {
        var a = args.map(a => JSON.stringify(a)).join();
        var result = originalMethod.apply(this, args);
        var r = JSON.stringify(result);
        console.log(`Call: ${key}(${a}) => ${r}`);
        return result;
    };

    return descriptor;
}

请参看 Stack-Overflow 上的答案 了解上面两个问题的更多信息

相关文章

网友评论

      本文标题:typeScript Decorators 的this作用域

      本文链接:https://www.haomeiwen.com/subject/kenvrctx.html