3

これから着手しようとしているプロジェクトで道場の使い方を学んでいるので、これはおそらく非常に基本的な質問であることを前もって告白します。私は答えを見つけようとしましたが、成功しませんでした。また、私は少し古いバージョンの dojo を使用する必要があります - 1.6 AMD なしではそう思います。

dojo.declare を使用してクラスを宣言しました。少し変更した例を次に示します。

dojo.declare("myNamespace.CustomClass", null, {
    firstProperty: "The default value",
    constructor: function () { }
    Test: function () {
        alert(this.firstProperty);
    }
});

したがって、基本的には、「デフォルト値」のデフォルト値を持つ firstProperty というパブリック プロパティを持つ CustomClass というクラス、現在何も実行しないコンストラクタ、呼び出されたときに次の値でアラートを出す Test というパブリック メソッドがあります。最初のプロパティ。

CustomClass のインスタンスを作成して Test() を呼び出すと、「デフォルト値」のアラート ボックスが表示されると想定していました。ただし、そうではありません。代わりに「未定義」の警告ボックスが表示されます。インスタンスが作成された後に firstProperty の値を設定してから Test を呼び出すと、機能し、プロパティに設定されていたものを取得できます。したがって、回避策はコンストラクターでデフォルト値を設定することですが、私が読んだことは、それが想定どおりに機能することを示唆しているため、むしろ正しく実行したいと思います。

また、コンストラクターで dojo.safeMixin(this, null) を呼び出してみましたが、これが必要かどうか疑問に思ったことがありましたが、違いはありませんでした。

とにかくこれを読んでくれてありがとう!サイモン

4

1 に答える 1

5

あなたが見逃している重要な概念は、スコープの概念です。その場合alert(firstProperty);、ローカル変数を参照していますfirstProperty。あなたの場合、その名前でローカル変数を定義していません。ただし、その名前でインスタンス変数を定義しました。Java などの言語とは異なり、インスタンス変数には を使用して明示的にアクセスする必要がありますthis

したがって、あなたの例は次のようになります。

dojo.declare("myNamespace.CustomClass", null, {
firstProperty: "The default value",
constructor:function(params){
    console.log(params);
    dojo.safeMixin(this,params);
},
Test: function () {
    alert(this.firstProperty);
}

});

var myInstance = new myNamespace.CustomClass({firstProperty:'something else'});
myInstance.Test();

JavaScript のスコープは非常に扱いにくいため、Javascript Scope Tricksも参照してください。

編集: dijit._Widget から継承されていないことに気付きました。その場合、 を使用してコンストラクタ パラメータをインスタンスに手動で適用する必要があります dojo.safeMixin。上記のコード例を更新しました。また、コードを示す単純な jsfiddleも作成しました。

于 2013-04-02T16:49:00.927 に答える