javascript-作成対象

4447 ワード

Javascript高級プログラム設計(第2版)6.1作成対象読み整理
  • 最も簡単な方法で、Objectの一例を作成し、属性方法
    var person = new Object();
    person.name = "rk-coder";
    person.age = 26;
    
    person.sayName = function (){
        console.log(this.name);
    };
    
    person.sayName();
    
    の欠点を追加する.大量のオブジェクトを作成し、大量の重複コードを生成する.
  • 工場モード
    function createPerson(name, age){
        var o = new Object();
        o.name = name;
        o.age = age;
        o.sayName = function (){
            console.log(this.name);
        };
        return o;
    }
    
    var person1 = createPerson("rk-coder", 26);
    var person2 = createPerson("rk-coder2", 27);
    
    person1.sayName();//rk-coder
    person2.sayName();//rk-coder2
    
    欠点:対象と対象のタイプを識別できない
  • コンストラクターモードECMAScriptにおけるコンストラクタを使用して、特定のタイプのオブジェクトを作成することができます.コンストラクタは他の関数とは違って、慣例に従って、コンストラクタの関数名の頭文字を区別するために、またコンストラクタによってインスタンスを作成するために、newオペレータを使用しなければなりません.
    function Person(name, age){
        this.name = name;
        this.age = age;
        
        this.sayName = function (){
            console.log(this.name);
        };
    }
    
    var person1 = new Person("rk-coder", 26);
    var person2 = new Person("rk-coder2", 27);
    
    person1.sayName();
    person2.sayName();
    
    ここでperson1person2の2つのオブジェクトは、constructorを指す1つのPerson属性を有する.constructor属性は最初にオブジェクトタイプを識別するために使用されたが、オブジェクトタイプを検出するには、instanceofオペレータを使用したほうがいい.
    console.log(person1.constructor == Person);//true
    console.log(person2.constructor == Person);//true
    console.log(person1 instanceof Object);//true
    console.log(person2 instanceof Object);//true
    console.log(person1 instanceof Person);//true
    console.log(person2 instanceof Person);//true
    
    構築関数と他の関数の違いは、呼び出しの仕方が違っています.コンストラクタ自体も関数であり、newを介して呼び出すことなく、通常の関数とは区別されず、普通の関数もnewを介してコンストラクタとして呼び出されることができる.短所:各方法は実例にもう一度作成します.
  • プロトタイプモード
    function Person(){};
    
    Person.prototype.name = 'rk-coder';
    Person.prototype.age = 26;
    Person.prototype.sayName = function (){
        console.log(this.name);
    };
    
    var person = new Person("rk-coder", 26);
    person.sayName();
    
    は、作成された関数ごとに1つのprototype(プロトタイプ)属性を有する.この属性は、特定のタイプのすべてのインスタンスによって共有できる属性および方法を含むオブジェクトを指します.構造関数を呼び出して作成したオブジェクトの例の原型オブジェクトです.プロトタイプオブジェクトを使用して、すべてのオブジェクトのインスタンスにその中に含まれる属性および方法を共有することができる.デフォルトでは、すべてのプロトタイプオブジェクトは自動的に1つのconstructor属性を獲得します.プロトタイプ属性の所在関数を指すポインタが含まれています.コンストラクタを呼び出して新しい例を作成すると、その内部にはコンストラクタを指すプロトタイプオブジェクトのポインタが含まれます(__proto__).コードがあるオブジェクトの属性を読み取るたびに、まず現在のオブジェクトのインスタンス自体から検索します.したがって、いくつかの属性および方法を設定することが、プロトタイプオブジェクトに影響を与えず、プロトタイプオブジェクトと同じ属性名または方法名を定義すると、プロトタイプ上の値を遮蔽することができる(返信が必要であれば、deleteを使用してインスタンス上の値を削除する必要がある).また、元のオブジェクトに対する修正は、修正前に作成したインスタンスでもすぐにインスタンスに反映されます.
  • isProttypeOf:そのプロトタイプオブジェクトが指定されたオブジェクトインスタンスに存在するかどうかを判断する.
  • hasOwnProperty:指定された属性がインスタンスに存在するかどうかを検出し、プロトタイプに存在するかを判断することができない.
  • in:属性がオブジェクトを介してアクセスできるかどうかを指定します.インスタンスに関係なく、プロトタイプに関係なく.短所:原型の中のすべての属性は共有されています.明らかにある程度不便をもたらします.実例は自分の属性が必要です.
  • は、コンストラクターモードとプロトタイプモードを使用して、コンストラクタモードを使用して例示的な属性を定義し、プロトタイプパターン定義方法と共有する属性を組み合わせている.これは、現在ECMAScriptで最も広く認知度が高いカスタムタイプを作成する方法です.
    function Person(name, age){
        this.name = name;
        this.age = age;
    }
    Person.prototype = {
        constructor: Person,
        sayName: function (){
            console.log(this.name);
        }
    };
    
    var person = new Person("rk-coder", 26);
    person.sayName();
    
  • 動的プロトタイプモード
    function Person(name, age){
        this.name = name;
        this.age = age;
        
        if(typeof this.sayName != 'function'){
            Person.prototype.sayName = function (){
                console.log(this.name);
            };
            //... ...
        }
    }
    
    var person = new Person("rk-coder", 26);
    person.sayName();
    
    は、プロトタイプオブジェクトを初期化するコンストラクタを最初に起動する.
  • 寄生構造関数モード
    function Person(name, age){
        var o = new Object();
        o.name = name;
        o.age = age;
        o.sayName = function (){
            console.log(this.name);
        };
    }
    
    var person = new Person("rk-coder", 26);
    person.sayName();
    
    は、このようなモードは、パッケージ作成対象のコードのみであり、新規作成されたオブジェクトに戻る.return文でコンストラクタを呼び出したときに返される値を書き換えます.しかし、戻ってきたオブジェクトとコンストラクタまたはコンストラクタのプロトタイプ属性とは関係がないので、instance ofオペレータに依存してオブジェクトのタイプを決定することはできません.試用は推奨されません.
  • このようなモードで作成されたオブジェクトは、sayName()方法を使用する以外に、nameの値にアクセスする他の方法がない.いくつかのセキュリティが実行される環境で使用するのに適しています.