-3

次のようなコード:

var Policy={
    initialize:function(){
        return function(){
               this.initialize.apply(this,arguments);
        };
    }
};
var AjaxLoadingPolicy= Policy.initialize();//(1)
AjaxLoadingPolicy.prototype={
    initialize:function(name){
        this.name=name;
    }
};

このコードに基づく AjaxLoadingPolicy は、(1) の this.initialize.apply(this,arguments) を持つ関数です。しかし、 this.initialize が何であるかはよくわかりません。また、なぜ AjaxLoadingPolicy.prototype で定義できるのでしょうか? また、superclass の優先順位をインスタンスに適用するために apply が使用されていませんか?

4

1 に答える 1

1

コードの(1)で、AjaxLoadingPolecyの値に、本体を持つ新しい関数オブジェクトへの参照が割り当てられます。

function(){
    this.initialize.apply(this,arguments);
}; 

その関数が呼び出されたときの値はthis、それがどのように呼び出されたかを確認することによってのみ決定できます。単にそのように呼び出された場合AjaxLoadingPolecy()thisグローバルオブジェクトを参照します(または厳密モードでは未定義)。

に割り当てられたオブジェクトにAjaxLoadingPolecy.prototypeは、AjaxLoadingPolecyのインスタンス(つまり、によって作成されたオブジェクト)によって継承されるinitializeメソッドがあり、 AjaxLoadingPolecy自体には継承されません。new AjaxLoadingPolecy()

オブジェクト[[Prototype]]は、独自のパブリックプロトタイプではなく、コンストラクターのパブリックプロトタイプ(インスタンスの内部と呼ばれる)から継承します。

ちなみに、OPでは次のようになります。

AjaxLoadingPolicy.prototype={
    initialize:function(name){
        this.name=name;
    }
};

とまったく同じです:

AjaxLoadingPolicy.prototype.initialize = function(name) {
    this.name=name;
};

2つ目は、既存のprototoypeオブジェクトを使用しますが、前者はそれを置き換えます(より多くのコードを使用し、オブジェクトのインスタンス化を無駄にします)。

apply関数のthis引数を設定し、引数を指定するために使用されます。ただし、 Javascriptにはクラス(またはスーパークラス)がなく、その動作をエミュレートするときに使用される可能性がありますapplycall

于 2012-07-20T06:17:15.440 に答える