0

関数が呼び出されるたびにメソッドが再定義されないように、メソッドをクラスのプロトタイプに直接割り当てることをお勧めします。

var A = function () {
    this.prop = "A property";
}
A.prototype.method = function () {
    return "A method";
}

このように定義されたメソッドをコンストラクターで呼び出したいとします。これは可能ですか?

var A = function (options) {
    initialize(options); // initialize is undefined.
}
A.prototype.initialize = function (options) {
    // do something with options.
}

コンストラクター内でスタブ メソッドを作成しても、関数のプロトタイプ バージョンの代わりに呼び出されるため、機能しません。this["initialize"]()これを機能させることができた唯一の方法は、かなり洗練されていないように見えるブラケット構文を介して関数を参照することです。

var A = function (options) {
    this["initialize"](options); // function isn't defined yet but will be soon!
}
A.prototype.initialize = function (options) {
    // do something with options.
}

これは非常にぎこちなく、おそらくこの関数を呼び出す最適な方法ではありません。別の方法がありますか、それとも何か不足していますか?

4

1 に答える 1

6

最後の方法は正しいですが、引用符は必要ありません。

var A = function (options) {
    this.initialize(options); 
};
A.prototype.initialize = function (options) {
    // do something with options.
};

Aがコンストラクターとして呼び出され、 が構築中thisの新しいオブジェクトへの参照であり、そのプロトタイプ チェーンが既に確立されていると仮定すると、既にinitializeメソッドにアクセスできます。

もちろん、initializeプロトタイプを作成する必要はありません。複数回呼び出されることが意図されていない場合は、スタンドアロン関数として定義する方が理にかなっています。

var A = function (options) {
    initialize(this, options); 
};
function initialize (obj, options) {
    // do something with options.
};

または、初期化コードをコンストラクター関数に直接配置することもできます。

于 2012-12-10T01:41:36.803 に答える