jsオブジェクト向けの一般的なオブジェクトの作成方法(ファクトリモード、コンストラクション関数モード、プロトタイプモード)

3224 ワード

前編ではjavascriptのオブジェクト指向の基礎を紹介しましたが、本編ではjavascriptのオブジェクト指向を深く学び続け、JSの文法は非常に柔軟で、簡単なオブジェクト作成にはいくつかの異なる方法があります.あまりにも柔軟なところに戸惑うこともありますが、今日はJSでよく使われるオブジェクトの作成方法をいくつか整理してみましょう.
前言
Objectコンストラクション関数を使用するか、オブジェクトの字面量を使用すると、オブジェクトを作成するのに便利ですが、1つのインタフェースを使用して複数のオブジェクトを作成すると冗長なコードが多くなるという明らかな欠点があります.そのため、この問題を解決するために、人々は以下のいくつかの方法を使用してオブジェクトをよく見るようになりました.
工場モード
このモードは、オブジェクトの作成の具体的なプロセスを抽象化し、関数を使用して特定のインタフェースでオブジェクトの詳細を作成します.

 function cPerson(name,sex,age){
 var o = new Object();
 o.name = name;
 o.sex = sex;
 o.age = age;
 o.show = function(){
 console.log(this.name,this.age,this.sex);
 }
 return o;
}
 var p1 = cPerson('  ',' ','100');
 p1.show();
 var p2 = cPerson('  ',' ','14');
 p2.show();

ファクトリモードテスト
ファクトリ方式の問題:ファクトリモードを使用すると、すべての情報を含むオブジェクトを作成でき、数回の呼び出しがないこの関数を作成できます.複数の類似オブジェクトを作成する問題を解決しますが、オブジェクト識別の問題(つまり、1つのオブジェクトのタイプをどのように知るか)は解決されません.
コンストラクタモード

function CPerson(name,sex,age) {//              
 this.name = name;
 this.sex = sex;
 this.age = age;
 this.show = function () {
 console.log(this.name, this.age, this.sex);
 }
}
var p1 = new CPerson('  ',' ','100');
 p1.show();
var p2 = new CPerson('  ',' ','14');
 p2.show();

コンストラクタモードテスト
構造関数と工場モデルの違いに注意してください.以下のようにします.
コンストラクタの頭文字の大文字
オブジェクトが明示的に作成されていません
属性とメソッドをthisオブジェクトに割り当てました
return文なし
このようにコンストラクション関数を呼び出すと、大体いくつかのステップがあります.
新しいオブジェクトを作成
コンストラクション関数の役割ドメインをこのオブジェクトに割り当てます(したがって、thisはこのオブジェクトを指します).
コンストラクション関数のコードの実行(新しいオブジェクトに属性とメソッドを追加するプロセス)
オブジェクトを返す
注意:コンストラクション関数は実際には通常の関数とあまり差がありません.唯一の違いは呼び出し方法の違いです.以下に、異なるいくつかの呼び出し方法を示します.

 //     1 new   
 var p1 = new CPerson('  ',' ','100');
 p1.show();//   100  
 //     2       
 CPerson('  ',' ','100');
 window.show()//   100               window   
 //     3              
 var obj = new Object();
 CPerson.call(obj,'  ',' ','100');
 obj.show(); //   100    obj    

コンストラクション関数の問題:コンストラクション関数を使用する最も主要な問題は、各メソッドがjsでもオブジェクトであるため、各インスタンスに再作成されることです.p 1とp 2にはshowメソッドがありますが、同じFunctionのインスタンスではありません.そのため、彼らが共有しているshowの方法は等しくありません.
プロトタイプモード
各関数にはprototypeプロパティがあります.このプロパティはポインタで、オブジェクトを指します.このオブジェクトの用途は、特定のタイプのすべてのインスタンスで共有できる属性とメソッドを含むことです.コンストラクション関数を呼び出して作成されたオブジェクトのプロトタイプオブジェクト
利点は、すべてのオブジェクトのインスタンスが彼のプロパティを共有できる方法です.つまり、コンストラクション関数でインスタンスの情報を定義する必要はありません.

 function CPerson(){
}
CPerson.prototype.name='  ';
CPerson.prototype.sex=' ';
CPerson.prototype.age=100;
CPerson.prototype.show=function(){
 console.log(this.name, this.age, this.sex);
}
var p1 = new CPerson();
 p1.show(); //   100  
var p2 = new CPerson();
 p2.show();//   100  
 console.log(p1.show == p2.show)//true

以上はjsがオブジェクト向けによく見られるオブジェクトの作成方法(ファクトリモード、コンストラクション関数モード、プロトタイプモード)について、お気に入りください.