2

クラス内に関数を作成すると、TSコンパイラはその関数をたとえばプロトタイプ関数として作成します。

class MyClass {
    getExample()
    {

    }
}

結果は

var MyClass = (function() {
    function MyClass() {}
    MyClass.prototype.getExample = function() {};
    return MyClass;
})();​

しかし、私が必要なのは

function MyClass() {

    this.getExample = function() {

    }
}​

このような関数を取得することは可能ですか?

4

4 に答える 4

3

このJQFAQ.comリンクを見てください。ここに、「TypeScriptでプロトタイプ化された関数に移動しないクラスで関数を作成する方法」という質問に対する回答があり、さらに多くのFAQが利用可能です。

于 2013-01-02T07:17:26.410 に答える
2

私は TypeScript を見てきました (オンラインの遊び場のように... 自分の JS を書くほうが好きですが :P)
私が知る限り、やりたいことは非常に簡単に実行できます。そして、これは私にとって魅力のように機能しました:

class Greeter {
    greeting: string;
    closureMethod;
    constructor (message: string) {
        this.greeting = message;
        var that = this;
        var closureMethod = function()
        {
            console.log(that.greeting);
        };
        this.closureMethod = closureMethod;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
}   
var greeter = new Greeter("world");
var another = new Greeter('Foobar');
var button = document.createElement('button');
button.innerText = "Say Hello";
button.onclick = function()
{
    greeter.closureMethod();
    another.closureMethod();
}
document.body.appendChild(button)

どちらも機能しましたが、さらに短くなりました(これも機能します)

class Greeter {
    greeting: string;
    closureMethod;//define property here, no type
    constructor (message: string) {
        this.greeting = message;
        var that = this;
        this.closureMethod = function()
        {
            console.log(that.greeting);
        };
    }
    greet() {
        return "Hello, " + this.greeting;
    }
}   

どちらも同じ結果を生成します。つまり、新しいインスタンスごとにメソッドを何度も定義するコンストラクターです (正直なところ、これは良いアイデアではありません)。
ご覧のとおりthat、 ではなくを使用してインスタンスにアクセスしますthis。これは、同じメソッドを何度も作成することの唯一の利点です...そうする正当な理由がある限り。しかし、私はこれについて暴言を吐くつもりはありません。
上記のコードは機能し、必要なコンストラクター関数を生成します。

于 2012-12-28T16:12:29.497 に答える
1

TypeScript でコンストラクターに追加するメソッドは、インスタンス メソッドとして追加されます。

コンストラクターの外およびクラス内に追加するメソッドは、オブジェクトのプロトタイプに追加されます。これは、メモリを節約するため、クラスの複数のインスタンスを「新しく」作成する場合に推奨される方法です。ただし、これを行う場合は、インスタンス memebrs と適切な「this」に必要なアクセス権があることを確認する必要があります。これは、事前に設定することで実行できます。

最初にプロトタイプを検討してから、メソッドに本当に必要な場合はインスタンスに戻ることをお勧めします。それがシングルトンオブジェクトである場合、それは本当に問題ではありません。

ただし... TypeScript でクラスを作成する場合、private と public の概念は出力された JavaScript に変換されません。したがって、JavaScript ですべてのインスタンス メンバーを公開しているので、このことに留意してください。JavaScript のモジュール パターンのようなパターンを使用することを好みます。これは、内部変数/メソッドを非表示にして、アクセス可能にしたいものだけを公開します。オブジェクトのアクセス可能なメンバー (クラスなし) を返す関数を作成することにより、TypeScript でこれを取得できます。代替案について言及したいと思いました。

于 2012-12-28T17:07:17.933 に答える
0

あなたはこのようにそれを行うことができます:

class MyClass {
    static getSomething() {

    }
}

staticキーワードは、プロトタイプメソッドではなく、インスタンスで呼び出す必要がないことを意味します。次のコマンドで呼び出すだけです。

MyClass.getSomething();

もちろん、これはあなたが望むものではないかもしれませんが、それを明確にするためになぜそれが必要なのかを共有する必要があります。

于 2012-12-29T11:52:24.027 に答える