JavaScriptのコンストラクターも他の言語とは異なります。新しいキーワードを介して呼び出される関数は、コンストラクターと見なすことができます。
コンストラクター本体の内部では、これは新しく作成されたオブジェクトを指します。コンストラクター本体に表示される式が表示されていない場合は、デフォルト、つまり新しく作成されたオブジェクトをデフォルトで返します。
コードコピーは次のとおりです。
function foo(){
this.bla = 1;
}
foo.prototype.test = function(){
console.log(this.bla);
};
var test = new foo();
上記のコードは、FOOをコンストラクターとして呼び出し、新しく作成されたオブジェクト(__Proto__)のプロトタイプをfoo.prototypeに指します。
コンストラクターで返された式を定義する場合、コンストラクターは式全体を返しますが、この戻り式はオブジェクトでなければなりません。
コードコピーは次のとおりです。
function bar(){
戻る2;
}
新しいbar(); //新しいオブジェクト
function test(){
this.value = 2;
戻る {
foo:1
};
}
new test(); //返されたオブジェクト
新しいものが省略されている場合、関数は新しいオブジェクトを返すことができません。
コードコピーは次のとおりです。
function foo(){
this.bla = 1; //グローバルオブジェクトに設定されます
}
foo(); // 未定義
上記の例はいくつかのシナリオでも機能する場合がありますが、JavaScriptではこれの作業メカニズムにより、これはここでグローバルオブジェクトを指します。
工場モデル
キーワードを新しく使用できるようにするには、コンストラクターが返品値を表示する必要があります。
コードコピーは次のとおりです。
function bar(){
var値= 1;
戻る {
方法:function(){
返品値。
}
}
}
bar.prototype = {
foo:function(){}
};
新しいbar();
バー();
上記の例では、新品を使用せずに機能バーを呼び出す効果は同じであり、メソッドメソッドを含む新しく作成されたオブジェクトが返されます。これは実際には閉鎖です。
ここで注意すべきことの1つは、新しいbar()がbar.prototypeを返さないが、代わりにリターン式内の関数メソッドのプロトタイプオブジェクトになることです。
上記の例では、newを使用するかどうかには機能に違いはありません。
工場モードを介して新しいオブジェクトを作成します
使用を忘れたらエラーを引き起こすため、新しい使用をしないことを思い出させることがよくあります。
オブジェクトを作成するには、工場パターンを使用して、工場パターン内で新しいオブジェクトを構築することを好みます。
コードコピーは次のとおりです。
function foo(){
var obj = {};
obj.value = 'blub';
var private = 2;
obj.somemethod = function(value){
this.value = value;
}
obj.getPrivate = function(){
プライベートを返す;
}
OBJを返します。
}
上記の例コードは、新規を使用する場合よりもエラーが発生しやすく、プライベート変数を使用する場合はより便利になりますが、いくつかの欠点があります。
プロトタイプオブジェクトを共有できないため、より多くのメモリが必要です。
継承を実現するには、工場パターンでは、別のオブジェクトのすべてのメソッドをコピーするか、新しいオブジェクトのプロトタイプとして使用する必要があります。
プロトタイプチェーンを放棄することは、新しい使用を避けるためだけです。これは、JavaScript言語の精神に反しているようです。
要約します
新しい使用はエラーを起こしやすい場合がありますが、これはプロトタイプチェーンの使用を放棄する理由ではありません。最終的にどの方法をとるかについては、アプリケーションのニーズに依存します。最良の方法は、スタイルを選択してそれに固執することです。
簡単に言えば、コンストラクターはインスタンスオブジェクトを初期化することであり、オブジェクトのプロトタイププロパティはインスタンスオブジェクトを継承します。