1。工場モデル
function person(name、age){var p = new object(); p.name = name; p.age = age; p.showmessage = function(){console.log( "name:"+this.name+"age:"+this.age); } return p;} var p1 = person( "k1"、28); var p2 = person( "k2"、29); console.log(p1.showmessage == p2.showmessage); // falseは同じshowmessage method console.log(p1.constructor); // [オブジェクト]です。工場パターンの欠陥は、オブジェクト認識の問題が解決されず、各オブジェクトのshowmessageメソッドが同じ方法ではないことです(各メソッドは各オブジェクトインスタンスで再作成されます)、オーバーヘッドが増加します。
2。コンストラクターモード
function person(name、age){this.name = name; this.age = age; this.showmessage = function(){console.log( "name:"+this.name+"age:"+this.age); }} var p1 = new person( "k1"、28); var p2 = new person( "k2"、29); console.log(p1.showmessage == p2.showmessage); // false not no no no no not no not not console.log(p1.conductor);コンストラクターパターンはオブジェクト認識の問題を解決しますが、各オブジェクトのshowmessageメソッドは同じ方法ではなく(各メソッドが各オブジェクトインスタンスで再現されます)、オーバーヘッドが増加します。
3。プロトタイプモード
function person()person.prototype.name = "k"; person.prototype.age = 29; person.prototype.showmessage = function(){console.log( "name:"+this.name+"age:"+this.age);}; var p1 = new person( person(); p2.showmessage(); // name:k age:29console.log(p1.showmessage == p2.showmessage); // true-リファレンスは同じ関数コンソール(p1.constuctor)// [person] - object認識console.log(p1 instancef person)// console.log(person.prototype.isprototypeof(p1)); // trueconsole.log(object.getPrototypeof(p1)== person.prototype); // trueプロトタイプパターンは、「各メソッドが各オブジェクトインスタンスで再現される」という問題を解決し、オブジェクト認識の問題も解決します。
プロトタイプモードの大きな問題は、関数プロトタイプに取り付けられているすべてのオブジェクト、変数、および関数が関数のすべてのインスタンスで共有されることです。プロトタイプのプロパティにはインスタンスP1およびP2を介してアクセスできますが、プロパティ値を変更することはできません。たとえば、p1.name = "k1"では、p1インスタンスにname = "k1"のプロパティを追加し、prototype.nameに変更しません。値タイプの場合は大丈夫ですが、参照タイプの場合、問題が発生します。次の例を参照してください
function person(){}; person.prototype.age = 10; person.prototype.array = [1,2,3]; var p1 = new person(); var p2 = new person(); console.log(p1.array); // [1,2,3] Console.log(p2.array); //P1はアレイに値を追加します。これはすべてP2にも反映されています。これはすべて同じ配列を指しているため
4。コンストラクターモードとプロトタイプモードの組み合わせ
これは、コンストラクターとプロトタイプパターンの利点を組み合わせて、オブジェクトを作成する最も一般的な方法です
function person(name、age){this.name = name; this.age = age;} person.prototype.showmessage = function(){console.log( "name:"+this.name+"age:"+this.age);}; var p1 = new person( "k"、30); p1.showmessage();5。動的プロトタイプモード
主なソリューションは、コンストラクターのすべての情報をカプセル化することです。これはOOのアイデアに沿っています
function person(name、age){this.name = name; this.age = age; if(typeof this.showmessage!= "function"){person.prototype.showmessage = function(){console.log( "name:"+this.name+"age:"+this.age); }}} var p1 = new person( "k"、30); p1.showmessage();6.寄生コンストラクタパターン
function person(name、age){var o = new object(); o.name = name; o.age = age; o.sayname = function(){console.log(this.name); }; return o;} var p1 = new person( "k"、28); p1.sayname();寄生コンストラクターパターンは、オブジェクトの作成時に新しいキーワードが使用されることを除いて、工場パターンとまったく同じです。上記の例:var p1 = new person( "k"、28)。
その主な機能は、このコンストラクターの関数を拡張することです。たとえば、アレイアレイに基づいており、次のように独自の方法があるアレイタイプMyArrayを定義したい
function myarray(){var values = new array(); values.push.apply(values、arguments); // values.topipedString = function(){this.this.join( '|'); }; return values;} var colors = new MyArray( "Red"、 "Blue"、 "Green"); console.log(colors.topipedstring()); console.log(colors instanceof array);7。安定したコンストラクターモード
安全なコンストラクターは、寄生コンストラクタータイプのパターンに従いますが、2つの違いがあります。1つはこれを使用しないことであり、もう1つはコンストラクターを呼び出すために新しい使用ではないことです。
function person(name、age){var o = new object(); var tempage = age; o.name = name; o.age = age; o.sayname = function(){console.log(name); } o.sayage = function(){console.log(tempage); } return o;} var p1 = person( "k1"、28); p1.sayname(); // k1p1.sayage(); // 28p1.name = "k2"; p1.age = 30; p1.sayname(); // k1p1.sayage(); // 28上記の出力を見ると、安全なオブジェクトパターンが何であるかを理解できます。これは、このモードを使用して作成されたオブジェクトです。初期化中に渡された値を変更する他の方法はありません。これは人です(「K1」、28)。そのようなオブジェクトは安全なオブジェクトです。実際、それはJavaScriptの閉鎖です。
JavaScriptオブジェクトを作成する方法の上記の簡単な分析は、私があなたと共有するすべてのコンテンツです。参照を提供できることを願っています。wulin.comをもっとサポートできることを願っています。