2016-12-19 8 views
2

私は、Typescript(2.1)とクラス、特に別のクラスを拡張するクラスで、私の頭の中で何が少し壊れています。私は `super`またはthisのいずれかを持つことができますが、両方を持つことはできません。

私は

foo =() => {}

としての機能を宣言した場合、私は無事

が、私はエラー

を得るように私は、super.foo()を使用することはできません機能で thisを使用することができます

TypeError: (intermediate value).foo is not a function

私は

foo() { }

としての機能を宣言した場合、私はsuper.foo()を使用することができますが、私は関数である方法に応じて、thisは同じ「この」すべての時間を指していることを確認することはできません呼び出される

この問題をどのように解決できますか?私はいくつかの提案を見てきましたが、すべての関数を宣言してbindを1つずつ他のものにしていましたが、それはばかげているようです...タイスクリプトにはこの醜さを覆う "魔法の"

答えて

1

クラスメソッドのいずれかインスタンス又はプロトタイプ上にあってもよい);

おかげ。残念ながら、ケーキを食べて食べることはできません。

メソッドがインスタンス上にある場合、クラスインスタンスごとにメソッドごとに1つのクロージャがあり、各インスタンスのクロージャには_thisという独自のコピーがあり、それによって関数が任意に呼び出されるようになります。しかし、メソッドがインスタンスにバインドされているため、派生クラスのinstatationは、基本クラスのメソッドコードを使用して既存のメソッドを作成しません。

メソッドがプロトタイプ上にある場合、メソッドごとにクロージャが1つあり、それらのメソッドはバインドされていないため、正しいメソッド構文で呼び出す必要があります。ここではは、(BaseClass.prototype.methodName)から基本クラスメソッドを取得するための既知の場所があるため、基本クラスの実装を呼び出すことができます。

fooが呼び出すロジックを処理する基本クラスメソッドを記述し、インスタンスメソッドを静的メソッドにすることをお勧めします。これは、間接的なレベルの1つのコストを犠牲にして、おおむね両方の世界で最高です。

例:説明のため

class Base { 
    protected static foo(instance: Base) { 
     instance.counter++; 
    } 

    counter = 0; 

    foo =() => Base.foo(this); 
} 

class Derived extends Base { 
    foo =() => { 
     Base.foo(this); 
     this.counter *= 2; 
    } 
} 
+0

感謝 - 私は私の心の中でそれを明確に取得し、戻ってきて、この構造で遊んでます。 – jmls

関連する問題