Как избежать жесткого кодирования этого? в декораторы

я прочитал"Как реализовать декоратор машинописи?" и несколько источников, но есть кое-что, что я не смог сделать с декораторами.

class FooBar {
    public foo(arg): void { 
        console.log(this);
        this.bar(arg);
    }
    private bar(arg) : void { 
        console.log(this, "bar", arg);
    }
}

Если мы вызываем функциюfoo:

var foobar = new FooBar();
foobar.foo("test"); 

ПредметFooBar зарегистрирован в консолиconsole.log(this); вfoo

Строка"FooBar {foo: function, bar: function} bar test" зарегистрирован в консолиconsole.log(this, "bar", arg); вbar.

Теперь давайте использовать декоратор:

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;
        }
    };
}

Мы используем ту же функцию, но оформлены:

class FooBar {
    @log
    public foo(arg): void { 
        console.log(this);
        this.bar(arg);
    }
    @log
    private bar(arg) : void { 
        console.log(this, "bar", arg);
    }
}

И мы призываемfoo как мы делали раньше:

var foobarFoo = new FooBar();
foobarFooBar.foo("test");

ПредметWindow зарегистрирован в консолиconsole.log(this); вfoo

А такжеbar никогда не вызываетсяfoo так какthis.bar(arg); причиныUncaught TypeError: this.bar is not a function.

Проблема в жестком кодеthis внутриlog декоратор:

value.value.apply(this, args);

Как я могу сохранить оригиналthis значение?

Ответы на вопрос(2)

Ваш ответ на вопрос