詳しく読んでください.

5654 ワード

ポイントが来ました.この章はしっかりと繰り返して見る価値があると思います.一回目はまだぼんやりしていて、今は二回目を見て、やっと意味が分かりました.
 
オブジェクトを作成
  • 工場モデル
    function createPerson(name, age, job){
    
        var o = new Object();
    
        o.name = name;
    
        o.age = age;
    
        o.job = job;
    
        o.sayName = function(){
    
            alert(this.name);
    
        };
    
        return o;
    
    }
    
    
    
    var person1 = createPerson("Nicholas", 29, "Software Engineer");
    
    var person2 = createPerson("Greg", 27, "Doctor");
    
                    
    利点:Objectコンストラクターまたはオブジェクトの字面量が複数のオブジェクトコードの重複を作成する問題点を解決しました.
  • コンストラクションモード:
    function Person(name, age, job){
    
        this.name = name;
    
        this.age = age;
    
        this.job = job;
    
        this.sayName = function(){
    
            alert(this.name);
    
        };
    
    }
    
    var person1 = new Person("Nicholas", 29, "Software Engineer");
    
    alert(person1.constructor == Person);
    
    alert(person1 instanceof Object);
    
    alert(person1 instanceof Person);
    
                    
    利点:その例を特定のオブジェクトの欠点として識別することができます.各方法は各インスタンスで再作成され、不必要なメモリ支出を増加させます.
  • プロトタイプモード
    function Person(){
    
    }
    
    Person.prototype.name = "Nicholas";
    
    Person.prototype.age = 29;
    
    Person.prototype.job = "Software Engineer";
    
    Person.prototype.sayName = function(){
    
        alert(this.name);
    
    };
    
    var person1 = new Person();
    
    person1.sayName();
    
    
    
    var person2 = new Person();
    
    person2.sayName();
    
    alert(person1.sayName === person2.sayName);
    
                    
    プロトタイプモードで作成された属性オブジェクトはすべてのインスタンスで共有されます.短所:原型パターンは引用タイプを含む場合、実例共有は比較的深刻な問題を引き起こす.すべての実装において直接プロトタイプにアクセスできず、オブジェクト間にこの関係があるかどうかは、isProttypeOf()だけで確認されます.例:Person.prototype.isPrototypeOf(person 1)は、インスタンスにプロトタイプと同名の属性を追加し、プロトタイプの値
    var person1 = new Person();
    
    var person2 = new Person();
    
    person1.name = "Greg";
    
    alert(person1.name);   //"Greg"——    
    
    alert(person2.name);   //"Nicholas"——    
    
                    
    hasOwnProperty()を変更せずに、インスタンスにこの属性を作成します.inは、移動先属性にアクセスできるかどうかを検出し、インスタンスでも原型でも可能である.
    /*            */
    
    function hasPrototypeProperty(object, name){
    
    	return !object.hasOwnProperty(name) && (name in object);
    
    }
    
                    
    より簡単なプロトタイプ:
    function Person(){
    
    }
    
    Person.prototype = {
    
        constructor : Person,  
    
        /*      prototype ,     constructor,    constructor   Object*/
    
        name : "Nicholas",
    
        age : 29,
    
        job : "Software Engineer",
    
        sayName : function (){
    
            alert(this.name);
    
        }
    
    };
    
    /*         ,  constructor      ,     ECMAScript5    ,  Object.defineProperty()      constructor*/    
    
    /*Object.defineProperty(Person.prototype, "constructor",{
    
        enumerable:false,
    
        value:Person
    
    });*/            
    
                    
    実例中のポインタはプロトタイプだけを指して、コンストラクタを指しません.
  • 組み合わせは、構造関数モードとプロトタイプモード構成関数モードを使用して、例示的な属性を定義し、プロトタイプパターンを使用して、方法と属性を共有する.
    function Person(name,age,job){
    
        this.name = name;
    
        this.age = age;
    
        this.job = job;
    
        this.friends = ["Shelby","Court"];
    
    }
    
    
    
    Person.prototype = {
    
        constructor : Person,
    
        sayName : function(){
    
            alert(this.name);
    
        }
    
    }
    
                    
  • 動的プロトタイプモードは、構造関数においてプロトタイプを初期化するために、すべての情報を構造関数にカプセル化する.利点:独立した構造関数モードとプロトタイプモードの独立した問題を解決し,両者の利点を同時に維持した.この方法を使ってオブジェクトを作成しますが、オブジェクトの字面の量重字の原型は使えません.
    function Person(name, age, job){
    
        this.name = name;
    
        this.age = age;
    
        this.job = job;
    
        //  
    
        if(typeof this.sayName != "function"){
    
            Person.prototype.sayName = function(){
    
                alert(this.name);
    
            };
    
        }
    
    }
    
                    
  • 寄生構造関数モードは、newオペレータを用いて使用される包装関数を構造関数と呼ぶ以外に、この方法は工場モードと同じである.
    例:特別な方法の配列を持ち、直接的にArayの構造関数を修正しない
    function SpecialArray(){
    
        //    
    
        var values = new Array();
    
        
    
        //   
    
        values.push.apply(values, arguments);
    
        
    
        //    
    
        values.toPipedString = function(){
    
            return this.join("|");
    
        };
    
        
    
        return values;
    
    }
    
    var colors = new SpecialArray("red","blue","green");
    
    alert(colors.toPipedString());    
    
                    
    このモードを使用すると、他のモードとの併用は避けてください.
  • 引き継ぐ
  • は、一般的に、インターフェースの継承と継承があり、jsは署名がないので、インターフェースの継承はサポートされていません.プロトタイプチェーンのみで継承が可能です.
  • プロトタイプチェーンの実現方法:SubType.prototype=new SuperType()注1:サブタイプは超種類の方法を書き換える必要があります.または超類の中に存在しない方法を追加する必要があります.継承文を実現してから、超種類の方法を遮断することができます.注2:プロトタイプチェーンを通して相続を実現する時、対象の字面量法を使用してプロトタイプを作成することができません.このようにするとプロトタイプチェーン
  • を書き換えることができます.
  • は、構造関数(偽造オブジェクト/古典的継承)を借りて、サブタイプの構造関数の内部でスーパータイプの構造関数SuperType.callを呼び出す.プロトタイプチェーンより継承される利点は、インスタンス共有の問題を解決し、パラメータの欠点をインスタンスと同じに伝えることができ、方法が共有できない問題
  • もある.
  • 合成モード
    function SuperType(name){
    
        this.name = name;
    
        this.colors = ["red","blue","green"];
    
    }
    
    SuperType.prototype.sayName = function(){
    
        alert(this.name);
    
    };
    
    
    
    function SubType(name, age){
    
        SuperType.call(this,name);
    
        
    
        this.age = age;
    
    }
    
    
    
    SubType.prototype = new SuperType();
    
    
    
    SubType.prototype.sayAge = function(){
    
        alert(this.age);
    
    };
    
    
    
    var instance1 = new SubType("Nicholas",29);
    
    instance1.colors.push("black");
    
    alert(instance1.colors);
    
    instance1.sayName();
    
    instance1.sayAge();
    
    
    
    var instance2 = new SubType("Greg",27);
    
    alert(instance2.colors);
    
    instance2.sayName();
    
    instance2.sayAge();
    
                        
  • プロトタイプ継承
    function object(o){
    
        function F(){}
    
        F.prototype = o;
    
        return new F();
    
    } 
    
                        
    着信先oへの浅いコピーを実現し、IE 9+のObject.create(o)に類似の機能を持つ
  • .