JAVSCRIPT対象(作成対象)第二章


  • オブジェクトの作成
  • 工場モデル
  • コンストラクションモード
  • 構造関数と一般関数の違い
  • 構造関数に存在する弊害
  • オブジェクトを作成
    Objectのコンストラクションや文字の量でオブジェクトを作成しますが、大量の重複コードが発生します.コードはメンテナンスされていません.
    工場モード
    ECMAScriptはクラスを作ることができませんので、工場モードでオブジェクトを作ることができます.パッケージオブジェクトとしても使えます.
    function createAnimal(name,age){
       var o = new Object();
       o.name = name;
       o.age = age;
       o.bark = function(){
          console.info(this.name);
       }
       return o;
    }
    
    var dog1 = createAnimal("Small Yellow",5);
    var dog2 = createAnimal("Big Yellow",25);
    注意:工場モードは対象を作成することができますが、対象識別問題を解決できません.
    コンストラクタモード
    ObjectやArayのようなオリジナルのコンストラクタが実行環境に出現します.また、カスタムのコンストラクタを作成し、コンストラクタを使って上記の例を再実現します.
    function Animal(name,age){
       this.name = name;
       this.age = age;
       this.bark = function(){
          console.info(this.name);
       }
    }
    
    var dog1 = Animal("Small Yellow",5);
    var dog2 = Animal("Big Yellow",25);
    この例では、Animalは工場モデルのcreateAnimal関数に取って代わられていますが、このような原生サポートの関数は工場モデルと異なるところが三つあります.
  • は、属性および方法
  • を起動するために、thisを使用する.
  • リセット文がありません.
  • 作成対象がありません.
  • OO(対象に向かって)言語を参考にして、関数名の頭文字を大文字として約束します.もちろん小文字は間違いないですが、これは勧められません.作成対象もOO言語と一致しています.newキーワードを通じてnewを使って構造関数を呼び出します.次の四つのステップがあります.
  • 新しいオブジェクトを作成します.
  • は、構造関数のスコープを新しいオブジェクトに与え、thisはこの新しいオブジェクト
  • を指します.
  • 構築関数のコード
  • を実行します.
  • は、新しいオブジェクト
  • に戻る.
    このとき、同じ関数で生成されたオブジェクトのタイプは一致しています.
    
    console.info((dog1.constructor == dog2.constructor) && (dog1.constructor == Animal) && (dog2.constructor == Animal));//true
    対象のタイプをチェックするなら、instance ofの方がいいです.
    console.info(dog1 instanceof Object);//true
    console.info(dog2 instanceof Object);//true
    console.info(dog1 instanceof Animal);//true
    console.info(dog2 instanceof Animal);//true
    注意:dog 1とdog 2は同時にObjectのサブクラスであり、この原理は原型継承であり、第三章では詳細な答えが出されます.
    構造関数と普通関数の違い
    実は、コンストラクタは普通の関数と何の違いもありません.コール方式の違いだけです.つまり、どの関数もnewで呼び出すことができますが、これはビジネスシーンの意味を失う可能性がありますので、どのように呼び出しますか?具体的な違いは次の例の中に一つ一つ現れます.
    //    new     
    var dog = new Animal("Small Yellow",5);
    dog.bark();//"Small Yellow"
    
    //        ,      
    Animal("Small Yellow",5);//   window
    window.bark(); //"Small Yellow"
    
    //           
    var o = new Object();
    Animal.call(o,"Small Yellow",5);//o  call   Animal     ,       apply  ,       
    o.sayName(); //"Small Yellow"
    コンストラクタに存在する弊害
    ここに言及して、知識を事前に強化しなければならなくて、すべての関数はすべてFunctionの実例です.オブジェクトを作成する時、newでコンストラクションを調整します.呼出するたびに、Animal内部コードは一回実行されます.ここのthis.barkは同じ関数ではありません.したがって、異なる実例における同名の関数参照は異なる.
    console.info(dog1.bark == dog2.bark);//false
    しかし、このような問題があったら、私たちは関数を外部に書くことで、こんな難しい問題を解決できます.それは弊害があって、共有のbarkは同一の引用ですが、このように全体の作用の領域の上で方法を定義して、このように多くの大域の関数をもたらすことができて、後で維持しにくいです.どうやってこの問題を解決すれば、次は原型モードに入りますか?
    function Animal(name,age){
       this.name = name;
       this.age = age;
       this.bark = bark;
    }
    
    function bark (){//      ,         ,        
       console.info(this.name);
    }
    
    var dog1 = new Animal("Small Yellow",5);
    var dog2 = new Animal("Big Yellow",25);