javascript対象パッケージ学習ノート


一.javascriptでは、一般的に「プロパティ」と「方法」を一つのオブジェクトにパッケージ化する方法があります.
  (1)工場モード:簡単な関数を使ってオブジェクトを作成し、オブジェクトに属性と方法を追加し、オブジェクトを返します.すなわち特定のインターフェースでオブジェクトを作成するための詳細を関数でカプセル化します.
 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 per1 = CreatePerson("xiyin",29,"FE");
var per2 = CreatePerson("xixi",21,"UI");
このモードは、類似した複数のオブジェクトを作成する問題を解決したが、オブジェクト識別の問題は解決されなかった.
(2)コンストラクタモード:カスタム参照タイプを作成でき、内蔵オブジェクトのインスタンスを作成することができます.同様にnewオペレータを使用します.
 function CreatePerson(name,age,job){
     this.name = name;
     this.age = age;
     this.job = job;
     this.getName = function(){
     alert(this.name);
   };
 
 }
 var per1 = new CreatePerson("xixi",22,"SE");
 var per2 = new CreatePerson("xiyin",23,"FF");
per 1とper 2は、CreatePersonの異なる例をそれぞれ保持しており、これらの2つのオブジェクトはいずれもCreatePersonに属性があり、オブジェクトであるかどうかを検証するためにinstance ofオペレータを使用してもよい.
     alert(per1.constructor == CreatePerson);//true
     alert(per2.constructor == CreatePerson);//true
     alert(per1 instanceof Object);//true
     alert(per1 instanceof CreatePerson);//true
コンストラクタの問題:コンストラクタの欠点、各メンバは多重化できません.関数を含みます.
  属性と方法は同じ内容であり、各方法はそれぞれの例で再作成され、異なる例にはコンストラクタ内の方法があるが、異なる例には同じFunctionの例ではなく、異なる例において同じ名前の関数が異なることを意味する.alert(per 1.getName=per 2.getName);/false;しかし、同じタスクを完了した2つのFunctionのインスタンスを作成する必要はなく、メモリを多く占用します.これは環境にも効率にも欠けています.
   属性と方法を一度しかメモリに生成しないように改良し、そのメモリアドレスをすべて指します.プロトタイプモードです.
  (3)プロトタイプモード:コンストラクタのprototype属性を使用して、共有すべき属性と方法を指定し、コンストラクタモードとプロトタイプモードを組み合わせる場合、コンストラクタを使用してインスタンス属性を定義し、プロトタイプを使用して共有の属性と方法を定義します.
   Javascriptでは、各構造関数にプロトタイプの属性があり、他のオブジェクトに向けられています.このオブジェクトの属性と方法は、配置関数のインスタンスによって継承されます.
 function CreatePerson(name,age,job){
    this.name = name;
    this.age = age;
    this.job = job;
 }
   CreatePerson.prototype.getName = function() {
     alert(this.name);
     };
  var per1 = new CreatePerson("xixi",22,"SE");
  var per2 = new CreatePerson("xiyin",23,"FF");
  alert(per1.getName == per2.getName);//true;
この場合、すべてのインスタンスのgetNameメソッドは、実際には同じメモリアドレスであり、prototypeオブジェクトを指すので、動作効率が向上します.
  proyotypeは各functionが定義する時に持参する属性であり、全ての対象がこの属性を持つわけではない.
  function CreatePerson(name,age,job){
     this.name = name;
     this.age = age;
     this.job = job;
   }
     CreatePerson.prototype.firstname = "xi";
     CreatePerson.prototype.getName = function() {
     alert(this.name);
      };
 var per1 = new CreatePerson("xixi",22,"SE"); 
 var per2 = new CreatePerson("xiyin",23,"FF");
  alert(per1 instanceof CreatePerson);//true
  alert(per1.getName == per2.getName);//true;
Prottypeに関する方法:
      (1)isPrototypeOf()   
   Object.isProttypeOf()は、オブジェクトが別のオブジェクトの原型かどうかを判断します.原型オブジェクトとインスタンスとの関係を判断します.
   文法:object.isPrototypeOf(o);
   パラメータ:o任意のオブジェクト
   戻り値:objectがoのプロトタイプであれば、trueに戻ります.そうでなければfalseに戻ります.
       alert(CreatePerson.prototype.isProttypeOf(per 1)//true 
  (2)Object.hasOwnProperty():属性が引き継がれているかどうかをチェックします.継承属性と非継承の局所属性を区別する方法を提供します.
     使い方:object.hasOwnProperty;
 パラメータ:文字列、オブジェクトの属性名、
値を返します.例えば、objectがpropnameで指定された非継承属性がある場合、trueに戻ります.objectがpropnameで指定された属性がない場合、またはプロトタイプのオブジェクトからこの属性を継承した場合、falseに戻ります. 
         alert(per 1.hasOwnProperty)//true,nameはper 1に固有の属性です.
         alert(per 1.hasOwnProperty)//false、firstnameはprototypeオブジェクトから引き継ぐ属性です.
(3)In演算子:ある属性があるオブジェクトの中に存在するかどうかを検出し、固有の属性であれ、継承の属性であれ.
    使い方:左側は属性名(文字列)、右側はオブジェクト、
     戻り値:オブジェクトの固有属性または継承属性にこの属性が含まれている場合、trueに戻ります.
         alert("name"in per 1)//true
         alert("firstname"in per 1)//true
 (4)Object.co nstructor、オブジェクトのコンストラクタ属性は、オブジェクトのコンストラクタの関数を参照しています.
 (5)instance of演算子は、オブジェクトのプロトタイプチェーンに構造関数のプロトタイプ属性があるかどうかを検出します.
      使い方:object instance of construct
            Object :The object to test.
            Costructor:Function to test against
        //defining constructor
        function C(){}
        function D(){}
        var o=new C();
        //true,because:Object.get ProttypeOf(o)==C.prototype
        o instance of C
        //false、because D.prototype is nowhere in's prototype chain
        o instance of D
        o instance of Object//true、because:
        C.prototype instance of Object//true
三.構造関数、プロトタイプ、実例の関係
各構成関数にはプロトタイプオブジェクトがあり、プロトタイプオブジェクトはいずれもプロトタイプオブジェクトの内部に向けられたポインタを含み、プロトタイプオブジェクトは同じグループの属性と方法を共有するメカニズムを提供しています. 
Proyotypeは各functionが定義する時に持参する属性で、全てのオブジェクトがこの属性を持つわけではありません.
Jsのすべてのオブジェクト(undefined、nullなどの特殊な場合を除く)には、内蔵されている「Prottype」属性があり、その「親類」を指すプロトタイプがあります.ECMAScript規格によると、someObject.[Prottype]記号は、someObjectを割り当てるためのプロトタイプです.これはJavaScriptに相当するプロトタイプです. プロパティ(現在は使用されていません)が、多くのJsの実装(例えば、Node、ほとんどのブラウザなど)は、この「Prottype」を指します.
Javascript 主にプロトタイプチェーンによって継承されます.プロトタイプチェーンの構築は、他のコンストラクタのプロトタイプに対する1つのインスタンスの値を付与することによって実現されます.