7

私はかなり経験豊富なプログラミングですが、TypeScript はまったく初めてです。

jQuery で使用しようとすると、すぐにコールバック ($(document).ready.

$.proxy() を使用するのも 1 つの方法ですが、TypeScript の矢印 (ラムダ) 関数を使用する方がはるかに優れているようです。しかし、私はそれらが式として使用されているのを見ただけです。つまり、関数全体がインラインで定義されています。クラスのメソッドとして呼び出すことができるアロー関数を設定できるようにしたいと思います (疑似コードで):

class Something {
    constructor() {
    $(' nav li').click(this.menuClick);
    }
 private menuClick (and this would be an arrow function to preserve 'this')()=>    
  // it would call this.anotherMethod()
  // plus lots of other things so it won't easily fit inline

 private anotherMethod():void {
        // do something on the menu click, several lines perhaps, 
  }

}

私は AS3 で OOP のバックグラウンドを持っていました。それが私がそれを行うことができた理由です。「これ」に簡単にアクセスできるか、アクセス方法が明確でした。TypeScript を使用して、Javascript プレーンで抱えている OOP のハードルを乗り越えたいと思っていますが、すべての jQuery 呼び出しをプロキシする必要があるのは (私にとっては) 面倒に思えます (これを実行するクラスが存在することは知っています)。私ですが、矢印/ラムダ関数を使用した簡単な方法はありますか?)。

私が明白なことを理解していない場合は、我慢してください。しかし、私には明らかではありません!

4

2 に答える 2

11

デフォルトでこれを行う方法がない理由は、自動的に行われる場合、インスタンスごとのメモリ消費に関して膨大なランタイム コストがかかるためです。すべての関数を含む 1 つの基本プロトタイプ オブジェクトを持ち、各クラス インスタンスがその関数定義のプロトタイプを指すのではなく、クラスのすべてのインスタンスに対して関数ごとにクロージャを持つことになります。

将来的には、これに対する型システムのサポートが改善される可能性がありますが、現時点では、thisバインディングの問題に対処することは、JavaScript を記述する際に支払わなければならない税金にすぎません。TypeScript のようなものが勢いを増すにつれて、ライブラリの作成者がthis-stomping の使用を減らすことを願っています (ただし、DOM にはそのような余裕はありません)。

利点は、TypeScript では、再再バインドが必要な場合でも、コードがそれほど多くないことですthis

$(' nav li').click(() => this.menuClick());

また

$(' nav li').click(this.menuClick.bind(this));

于 2012-12-13T00:01:07.933 に答える
2

簡単な答え:

変更する場合:$(' nav li').click(this.menuClick);

の中へ :$(' nav li').click(() => this.menuClick());

次に、メソッドthis内のクラス「何か」になります。menuClick

于 2012-12-13T09:32:04.617 に答える