JavaScript のコンストラクターも他の言語とは異なります。 new キーワードを使用して呼び出された関数はすべてコンストラクターとして使用できます。
コンストラクター本体内で、これは新しく作成されたオブジェクトを指します。コンストラクター本体に return 式が表示されていない場合は、デフォルトでこれ (新しく作成されたオブジェクト) が返されます。
上記のコードは、コンストラクターとして Foo を呼び出し、新しいオブジェクトのプロトタイプ (__proto__) を Foo.prototype にポイントします。
コンストラクター内で return 式を定義すると、コンストラクターは式全体を返しますが、この return 式はオブジェクトである必要があります。
new が省略された場合、関数は新しいオブジェクトを返すことができません。
上記の例は一部のシナリオでも機能する可能性がありますが、JavaScript の動作メカニズムにより、これはグローバル オブジェクトを指します。
工場出荷時モード
キーワード new を使用せずに済むようにするには、コンストラクターは明示的に値を返す必要があります。
上記の例では、new を使用せずに関数 Bar を呼び出した場合と同じで、メソッドメソッドを含む新しく作成されたオブジェクトが返されます。これは実際にはクロージャです。
ここで注意すべき点の 1 つは、 new Bar() は Bar.prototype を返すのではなく、return 式内の関数メソッドのプロトタイプ オブジェクトを返すということです。
上記の例では、new を使用するかどうかに機能的な違いはありません。
ファクトリ パターンを通じて新しいオブジェクトを作成する
new の使用を忘れるとエラーが発生するため、new を使用しないようにとよく注意されます。
オブジェクトを作成するには、ファクトリ パターンを使用し、ファクトリ パターン内に新しいオブジェクトを構築することを好みます。
var private = 2;
Obj.someMethod = function(value) {
This.value = 値;
}
obj.getPrivate = function() {
return private;
}
obj を返します;
}
上記のコードは new を使用するよりもエラーが発生しにくく、プライベート変数を使用する場合により便利ですが、いくつかの欠点もあります。
プロトタイプ オブジェクトは共有できないため、より多くのメモリが必要になります。
継承を実装するには、ファクトリ パターンで別のオブジェクトのすべてのメソッドをコピーするか、それを新しいオブジェクトのプロトタイプとして使用する必要があります。
new の使用を避けるためだけにプロトタイプ チェーンを放棄することは、JavaScript 言語の精神に反するように思えます。
概要
new を使用するとエラーが発生しやすくなりますが、これはプロトタイプ チェーンの使用を諦める理由にはなりません。最後のアプローチについては、アプリケーションのニーズによって異なります。最善の方法は、スタイルを選択し、それに固執することです。
簡単に言うと、コンストラクターはインスタンス オブジェクトを初期化し、オブジェクトのプロトタイプ属性はインスタンス オブジェクトを継承します。