JavaScript対象に向けたプログラム設計3—コンストラクションモードとプロトタイプモードを組み合わせる


1.原型対象の問題    まず、構造関数のための初期化パラメータの転送は省略され、結果はすべてのインスタンスがデフォルトで同じ属性値を取得します.    最大の問題は、その共有の本質によるものである.        プロトタイプのすべての属性は多くのインスタンスに共有されており、この共有は関数にとって非常に適切である.        これらの基本値の属性についても過去に述べたように、インスタンスに同名の属性を付加することによってプロトタイプの属性を遮断することができるからである.        しかし、引用タイプの値を含む属性については、問題が顕著である.
    function Person() {}
    Person.prototype = {
        constructor : Person,
        name : "answer",
        age : 22,
        job : "Software Engineer",
        friends : ["xhc", "jmn"],
        sayName : function() {
            alert(this.name);
        }
    }
    var person1 = new Person();
    var person2 = new Person();
    person1.friends.push("new");
    alert(person1.friends);    //"xhc,jmn,new"
    alert(person2.friends);    //"xhc,jmn,new"
 一般的には、異なるインスタンスは、それぞれ異なる属性のすべてを持つ必要がある.この問題は、プロトタイプを単独で使うことが少ない原因です.
 
2.コンストラクターモードとプロトタイプモードを組み合わせて使用する(参照の種類を定義するデフォルトモードとして使用することができる)    カスタムオブジェクトを作成する最も一般的な方法は、コンストラクションモードとプロトタイプモードを組み合わせて使用することです.    コンストラクターモードは例示的な属性を定義するために使用され、プロトタイプモードは方法と共有の属性を定義するために使用される.    したがって、各インスタンスは、それぞれのインスタンス属性のコピーを持っているが、同時に、この方法の参照を共有し、メモリを最大限に節約する.    さらにこのモードは構造関数へのパラメータの伝達をサポートしている.
    function Person(name, age, job) {
        this.name = name;
        this.age = age;
        this.job = job;
        this.friends = ["xhc", "jmn"];
    }
    Person.prototype = {
        constructor : Person,
        sayName : function() {
            alert(this.name);
        }
    }