「typescript デコレーターの実装方法」を読みました。複数のソースがありますが、デコレータではできなかったこともあります。
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
は in によってコンソールに記録されconsole.log(this);
ますfoo
文字列"FooBar {foo: function, bar: function} bar test"
は in によってコンソールに記録され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
は in によってコンソールに記録されconsole.log(this);
ますfoo
Andは、cause causeによってbar
呼び出されるfoo
ことはありません。this.bar(arg);
Uncaught TypeError: this.bar is not a function
問題は、デコレータthis
内にハードコーディングされていることです:log
value.value.apply(this, args);
this
元の値を保存するにはどうすればよいですか?