10

タイプスクリプトに、プロトタイプではなくインスタンスにメソッドを配置させることは可能ですか? プロトタイプにメソッドがあると問題が発生する「この」スコープの問題が頻繁に発生するため、これを尋ねます。

編集


たとえば、ts からの出力では一貫性がないように見えます。FooViewModel 関数で FooAlert を保持しますが、プロトタイプではメソッド openFooAlertDialogueAdd を保持します

JS

var FooViewModel = (function () {
    function FooViewModel (json) {
        this.Foolert = ko.observable();

    }
    FooViewModel.prototype.openFooAlertDialogueAdd = function () {
        this.FooAlert = something;
    };

Ts

class FooViewModel{
     FooAlert = KnockoutObservableAny

      constructor(){
         this.FooAlert = ko.observable();
       }
     openFooAlertDialogueAdd() {
        this.FooAlert = something;
    };

}
4

3 に答える 3

18

あなたがスコープの問題を抱えているなら、私はあなたの息子に申し訳ありません.99の問題がthisありますが、1つではありません!

Steve の回答は、クラス メソッド (各インスタンスで公開されるメソッド) を定義する正しい方法を示しています。ただし、スコープの問題が発生している場合は、おそらく別のコンテキストからこれらのメソッドを呼び出していることが原因です。

たとえば、Knockout を使用していて、これらのメソッドの 1 つをclickバインディングにバインドすると、Knockout はスコープを、メソッドを定義したスコープではなく、バインディングの現在のスコープにオーバーライドします。

このスコープの損失を防ぐには、2 つのオプションがあります。

まず、コンストラクターでメソッドを定義して、プロトタイプではなくインスタンスで公開できます。

お気に入り:

class Greeter {
    greet:() => string;
    greeting: string;

    constructor(message: string) {
        this.greeting = message;
        this.greet = () => {
            return "Hello, " + this.greeting;
        }
    }

次に、=>構文を使用してクラス メソッドのスコープを設定できます。

例:

class Greeter {
    greeting: string;
    constructor() {
        this.greeting: "Blabla";
    }
    greet= () => {
        alert(this.greeting);
    }
}
于 2013-03-11T14:19:33.140 に答える
5

プロトタイプメソッドは、各インスタンスで使用できるメソッドです。

class Example {
    constructor(private someProperty: string) {

    }

    method() {
        return this.someProperty;
    }
}

var exampleA = new Example('A');
var exampleB = new Example('B');
var exampleC = new Example('C');

console.log(exampleA.method()); // A
console.log(exampleB.method()); // B
console.log(exampleC.method()); // C

各インスタンスには と があり、somePropertyそのmethod()プロトタイプにコピーされます。これは、次を使用して確認できます。

alert(exampleC.hasOwnProperty('someProperty') ? 'Yes' : 'No');

インスタンスが独自のプロパティを持たない場合にのみ、JavaScript は依存関係チェーンをたどり、依存関係チェーンの上位にあるクラスのプロパティを見つけます。

の範囲で問題が発生しているコードを提供してthisいただければ、修正のお手伝いをさせていただきます。

于 2013-03-11T10:11:22.387 に答える
0

@Anzeoが彼の回答と編集で指摘したように、これはTypeScript/Knockoutの問題のようです。メソッド宣言をコンストラクターに入れることで問題を回避しましたが、Knockout の Computed Observable ドキュメント のvar self = this;「「this」の管理」セクションで指摘されている規則も使用しています。TS コードは次のようになります。

class FooViewModel{
    FooAlert: KnockoutObservableAny;
    openFooAlertDialogueAdd: () => void;

    constructor(){
        var self = this;
        self.FooAlert = ko.observable();
        self.openFooAlertDialogueAdd = function(){
            self.FooAlert('whatever your FooAlert observable takes');
        };
    }
}

どのようなスコープの変更が発生したとしても、JavaScript のクロージャーにより、変更selfについて心配する必要がなくなりthisます。それは両方の問題を解決するはずです。

于 2013-09-06T15:08:02.487 に答える