javascriptは対象に向かって設計します.


Objectコンストラクタやオブジェクトの字面の量はすべて単一のオブジェクトを作成するために使用できますが、これらの方法は明らかな欠点があります.同じインターフェースを使って多くのオブジェクトを作成すると、多くの重複コードが発生します.この問題を解決するために、人々は工場モデルの変体を使い始めました.
一、工場モデル
工場モデルはソフトウェアエンジニアリング分野で広く知られている設計モデルであり、このようなモデルは具体的な対象を作成する過程を抽象的に示している.以下の通りです
function createPerson(name,age,job) {
    var o=new Object();
    o.name=name;
    o.age=age;
    o.job=job;
    o.sayName=function () {
        console.log(this.name);
    };
    return o;
}
var person1=createPerson("Nicholas",29,"Software Engineer");
var person2=createPerson("Greg",27,"Doctor");
工場モードは複数の類似対象を作成する問題を解決しましたが、対象識別の問題を解決しませんでした.
二、コンストラクタモード
構造関数のパターンを使用して、前の例を次のように書き換えることができます.
function Person(name,age,job) {
        this.name=name;
        this.age=age;
        this.job=job;
        this.sayName=function () {
            console.log(this.name);
        };
    }
    var person1=new Person("Nicholas",29,"Software Engineer");
    var person2=new Person("Greg",27,"Doctor");
以上のコードの特徴:
①表示されていない作成オブジェクト
②直接属性と方法をthisオブジェクトに付与しました.
③return文がありません.
Personの新しいインスタンスを作成するには、newオペレータが必要です.このようにコンストラクタを呼び出すと実際には4つのステップがあります.
①新規オブジェクトの作成
②構造関数のスコープを新しいオブジェクトに割り当てます.
③コンストラクタのコードを実行する(この新しいオブジェクトに属性を追加する)
④新しいオブジェクトに戻る
上記の例では、person 1とperson 2はそれぞれPersonの異なる例を保存している.この2つのオブジェクトは、次のようにPersonを指すconstructor属性を持っています.
console.log(person1.constructor==Person);
console.log(person2.constructor==Person);
オブジェクトのconstructor属性は最初に使用され、オブジェクトのタイプを識別します.ただし、対象のタイプをチェックすると、やはりinstance ofオペレータの方が信頼性が高いです.
console.log(person1 instanceof Person);
console.log(person2 instanceof Person);
console.log(person1 instanceof Object);
console.log(person2 instanceof Object);
三、原型モード
私たちが作成した各関数にはプロトタイプの属性があります.この属性はポインタでオブジェクトを指します.このオブジェクトの用途は特定のタイプのすべてのインスタンスで共有できる属性と方法を含んでいます.プロトタイプは、構造関数を呼び出して作成されたそのオブジェクトの例の原型オブジェクトとして理解されます.プロトタイプオブジェクトを使用する利点は、すべてのオブジェクトインスタンスが、その中に含まれる属性および方法を共有することができることである.以下の通りです
  function Person() {

    }
    Person.prototype.name="Nicholas";
    Person.prototype.age=29;
    Person.prototype.job="Software Engineer";
    Person.prototype.sayName=function () {
        console.log(this.name);
    };
    var person1=new Person();
    person1.sayName();
    var person2=new Person();
    person2.sayName();
いずれにしても、新しい関数を作成すると、特定のルールのセットに従ってプロトタイプ属性を作成します.この属性は関数のプロトタイプオブジェクトを指します.デフォルトでは、すべてのプロトタイプのオブジェクトが自動的にconstructor属性を取得します.この属性にはプロトタイプの属性がある関数を指すポインタが含まれています.前の例を挙げると、Person.prototype.com nstructorはPersonを指します.このコンストラクタによって,プロトタイプオブジェクトに他の属性と方法を追加し続けることもできる.
カスタムコンストラクタを作成した後、プロトタイプオブジェクトはデフォルトではconstruct属性のみを取得します.他の方法はObjectから継承されます.コンストラクタを呼び出して新しい例を作成すると、この例の内部にはコンストラクタのプロトタイプオブジェクトを指すポインタ(内部属性)が含まれます.firefox、safari、chromeは各オブジェクトに一つの属性をサポートします.proto_他の実装では、この属性はシナリオに対しては全く見えない.この接続はインスタンスとコンストラクタのプロトタイプオブジェクトの間に存在する.
四、コンストラクタモードとプロトタイプモードを組み合わせて使う
カスタムタイプを作成する最も一般的な方法は、コンストラクションモードとプロトタイプモードを組み合わせて使用することです.コンストラクターモードは例示的な属性を定義するために使用され、プロトタイプモードは方法と共有の属性を定義するために使用される.結果として、各インスタンスは、自分のインスタンス属性のコピーを持っていますが、同時に方法への参照を共有しています.メモリを最大限に節約します.さらに,この混成モードは,構造関数へのパラメータの伝達をサポートしている.
  function Person(name,age,job) {
        this.name=name;
        this.age=age;
        this.job=job;
        this.friends=["shellby","court"];
    }
    Person.prototype={
        constructor:Person,
        sayName:function () {
            console.log(this.name);
        }
    }
    var person1=new Person("Nicholas",29,"Software Engineer");
    var person2=new Person("Greg",27,"Doctor");
    person1.friends.push("val");
    console.log(person1.friends);
    console.log(person2.friends);
    console.log(person1.friends===person2.friends);
    console.log(person1.sayName===person2.sayName);
五、ダイナミックモデル
動的プロトタイプモードはすべての情報を構造関数にカプセル化し,プロトタイプ(必要な場合のみ)をコンストラクタとプロトタイプを同時に使用する利点を維持した.言い換えれば、あるべき方法が有効かどうかを調べることによって、プロトタイプを初期化する必要があるかどうかを決定することができる.
  function Person(name,age,job) {
        this.name=name;
        this.age=age;
        this.job=job;
        if(typeof this.sayName!="function"){
            console.log("sayName   ");
            Person.prototype.sayName=function () {
                console.log(this.name);
            };
        }
    }
    var friend=new Person("Nicholas",29,"Software Engineer");
    friend.sayName();
六、寄生構造関数モード
寄生構造関数モードの基本的な考え方は、パッケージの作成対象コードのみを作成し、新規作成したオブジェクトに戻ります.しかし,表面から見て,この関数は典型的なコンストラクターとよく似ている.
 
七、安定構造関数モード
 
転載先:https://www.cnblogs.com/yjingjing/p/7028367.html