オブジェクトコンストラクタリテラルまたはオブジェクトが単一のオブジェクトを作成するために使用することができ、これらの方法の使用は、同じインタフェース、重複コードの大量の多くのオブジェクトを作成します。この問題を解決するために、工場出荷時のパターンの変形が使用されるようになりました。
1、工場モデル
Abstract Factoryパターン特定のオブジェクトを作成するプロセス。クラスの開発者が作成していないのECMAScriptの機能を発明しているので、機能は、次のようなインタフェースオブジェクトを作成するために具体的な詳細をカプセル化します
1つの 関数createPerson(名前、年齢、ジョブ){
2 のvar O = 新しいオブジェクト();
3 o.name = 名。
4 o.age = 年齢;
5 o.job = ジョブ。
6 o.sayName = 関数(){
7 アラート(この.nameの)。
8 }
9 リターンO;
10 }
11 VAR PERSON1 = createPerson( "アンナ"、26、 "ソフトウェアエンジニア" )。
12 VAR PERSON2 = createPerson( "リリー"、24、 "教師")。
これは、オブジェクト毎回3つのメソッドを含むプロパティを返す多数回createPerson()関数を呼び出すことができます。
ファクトリモードあなたは、複数のオブジェクトを作成することができますが、オブジェクトの種類を識別することはできませんが。
2、モデルコンストラクタ
ネイティブコンストラクタ(例えば、オブジェクト、アレイ)、カスタムコンストラクタを含むオブジェクトの特定のタイプを作成するためのコンストラクタ。
次のようなカスタムコンストラクタ、オブジェクトタイプは、カスタムプロパティとメソッドを定義し、
1つの 関数人(氏名、年齢、職業){ // 従来のコンストラクタ大文字の文字、非コンストラクタ文字で始まる
2 本 .nameの=名; // 直接このオブジェクトの属性およびメソッドに割り当てコンストラクタ
3 本 .age = 年齢;
4 本 .JOB = ジョブ;
5 この .sayName = 関数(){
6。 アラート(この.nameの);
7 };
8 }
9。 // 新しいオペレータ人新しいインスタンスの作成
10 VARを = PERSON1 新しい新しい人( "アンナ"、26は、 "ソフトウェアエンジニア" );
11 VARPERSON2 = 新しい人( "リリー"、24、 "先生");
:新しいオペレータが4つのステップ次のコンストラクタ・マネージャを呼び出して使用して
、(1)オブジェクトを作成し、
新しいオブジェクトのコンストラクタへの割り当ての(2)範囲(したがって、これは、新しいオブジェクトを指す)、
(3)実行するように構成される(新しいオブジェクトの属性に追加された)機能コード。
(4)新しいオブジェクトを返します。
作成されたオブジェクトの例のような、人を指すコンストラクタ(コンストラクタ)性質を有する:
アラート(== person1.constructor人); //真の
本来のオブジェクトの種類を識別するために使用されるオブジェクトのコンストラクタプロパティ。しかし、検出対象の種類、instanceofはより信頼性の高いです。オブジェクトインスタンスの両方で作成されたオブジェクトの例には、人の一例です。以下のような:
アラート(PERSON1のinstanceofオブジェクト); // trueにすべてのオブジェクトのObjectから継承
アラート(PERSON1人のinstanceof); // trueに
ローカルモードコンストラクタ工場モードよりも優れています。例から、将来的に定義されたコンストラクタがあると同定することができます一つの特定のタイプ。
コンストラクタ欠点:それぞれの方法は、各インスタンスに再び再作成する必要があります。しかし、機能は同じタスクを達成するために複数のインスタンスを作成する必要はありません。
図3は、原型パターン
各プロトタイプ(原型)属性、特定のタイプのすべてのインスタンスで共有することができるプロパティとメソッドを含むオブジェクトへのポインタを作成する機能を有します。
オブジェクトのプロトタイプを使用する利点は:それは共有の例が含まれているすべてのオブジェクトのプロパティとメソッドを作ることができます。
1 関数人(){
2 }
3 Person.prototype.name = "アンナ" 。
4 = 29 Person.prototype.age 。
5 Person.prototype.job = "ドクター" 。
6 Person.prototype.sayName = 関数(){
7 アラート(この.nameの)。
8 }。
9 のvar PERSON1 = 新しい人();
10 person1.sayName()。 // "アンナ"
11 のvar PERSON2 = 新しい人();
12 person2.sayName()。 //"アンナ"
13アラート(person1.sayName == person2.sayName)。 // 真
4、コンビネーションモードとプロトタイプモデルのコンストラクタ
最も広く使用されている、方法のカスタム型を確立するために、アイデンティティの最高度、デフォルトモード定義された参照型。
コンストラクタは、インスタンス属性モード、メソッドおよび共有プロパティを定義するために使用されるプロトタイプモデルを定義するために使用されます。
各インスタンスは、インスタンス属性の独自のコピーを持っていますが、同時にメモリ節約を最大化するために、相互に参照して共有します。
サポートは、コンストラクタにパラメータを渡します。
1つの 関数人(名前、年齢、ジョブ){
2 本 .nameの= 名前。
3 この .age = 年齢;
4 本 .JOB = ジョブを、
5 これは、 = [ "シェルビー"、 "コート" .friends ]。
6 }
7 Person.prototype = {
8 コンストラクタ:人、
9 sayName:関数(){
10 アラート(この.nameの)。
11 }
12 }
13 のvar PERSON1 = 新しいです人物(「アンナ」、26、「ソフトウェアエンジニア」)。
14 のvar PERSON2 = 新しい人( "グレッグ"、27、 "医者" );
15
16 person1.friends.push( "バン" )。
17警告(person1.friends)。 // "シェルビー、裁判所、ヴァン"
18警告(person2.friends)。 // "シェルビー、裁判所"
19の警告(person1.friends === person2.friends)。 // 偽の
20の警告(person1.sayName === person2.sayName)。 // 真
5、動的プロトタイプモデル
コンストラクタとプロトタイプを使用することの利点を維持しながら、すべての情報は、コンストラクタのプロトタイプ(必要な場合のみ)に初期化することにより、コンストラクタ内にカプセル化。
1つの 関数人(氏名、年齢、職業){
2 // プロパティ
3。 この .nameの= 名;
4 本 .age = 年齢;
5 本 .JOB = ジョブ;
6 // 方法
7。 IF(typeof演算 本 .sayName =「!関数「){ //は、プロパティまたはメソッドがいずれであってもよく確認することができる
8。 Person.prototype.syaName = 関数(){
9。 アラート(この.nameの);
10 };
11 }
12れる }
13れます VaRの友人= 新しい人(「アンナ」、27、「ソフトウェアエンジニア」)。
14 friend.sayName()。
ここで作られたプロトタイプの修正は、すべてのインスタンスに直ちに反映させることができます。
注:動的なプロトタイプモデルは、文字通りのプロトタイプオブジェクトを書き換えるために使用することはできません。あなたはプロトタイプの書き換えインスタンスを作成した場合、それは、既存および新規のプロトタイプ・インスタンス間のリンクを解除されます。
6、スプリアスモードコンストラクタ
パッケージを作成する関数のオブジェクトコードを作成するためには、新しく作成されたオブジェクトを返します。
1つの 関数人(氏名、年齢、職業){
2 のvar O = 新しい新しいオブジェクト();
3 o.name = 名;
4 o.age = 年齢;
5 o.job = ジョブ;
6 o.sayName = 関数(){
。7 アラート(この.nameの);
8 };
9 リターン O; // デフォルトでは、新しいオブジェクト・インスタンスを返す値返さないコンストラクタ;戻り値が返されたときに、コンストラクタを呼び出すことで返される値を上書きすることができ
10 }
。11 VaRの友達= 新しいは新しい人(「アンナ」、27、「ソフトウェアエンジニア」);
12は、friend.sayName(); // 「アンナ」
あなたはこのパターンを使用することができますので、それは直接、Arrayコンストラクタを変更されていないため、追加のメソッドの特殊な配列を作成するとします。
1つの 関数SpecialArray(){
2 // 配列を作成
3つの。 VaRの値= 新しい新しいアレイ();
4 // 値を追加
5。 values.push.apply(値、引数);
6 // 添加方法
7。 values.toPipedString = 関数() {
8に 戻り 、この .joinを( "|" )
。9 };
10 // 戻さアレイ
11 の戻り値を、
12である }
13は、 VARの色= 新しい新 SpecialArray( "赤"、 "青"、 "緑" )。
14アラート(colors.toPipedString())。 // 「赤|青|緑」
オブジェクトコンストラクタリターンのプロトタイプ性の間には関係がない、コンストラクタ外部オブジェクトとオブジェクトコンストラクタ戻るには異なるが作成されません。
INSTANCEOFオペレータは、決定されたオブジェクトの種類に依存することはできません。他のモードを使用する場合に推奨さ、このモードを使用しないでください。
7、コンストラクタセキュアモード
およびセキュアなオブジェクト:いいえパブリックプロパティ、この方法は、オブジェクトへの参照ではありません。データが他のアプリケーションによって変更されたとき、予防または使用する(この環境と新しいの使用を禁止)セキュリティ環境の一部で最適なサウンドオブジェクト、。
1 関数人(氏名、年齢、職業){
2 // 返されるオブジェクトを作成
3。 VAR Oが= 新しい新しいオブジェクト();
4つの // プライベート変数および属性は、ここで定義することができる
。5
。6 // 添加方法
。7 o.sayName = 関数(){
8。 アラート(名前);
9 };
10 //は、オブジェクトを返す
11。 リターンO;
12である }
13である VaRの友人に人=( "アンナ"、27、 "ソフトウェアエンジニア" );
14 friend.sayName(); / / sayName()メソッドを呼び出すことに加え、「アンナ」、そのデータメンバにアクセスする方法が他にありません
15 // 特定のセキュアな実行環境に非常に適し
注:オブジェクトとコンストラクタを作成するためにセーフモードコンストラクタの間に関係がない、などのオブジェクトのようにinstanceofはオペレータは意味がありません。