【JavaScript】【学習】オブジェクトの作成と継承

5261 ワード

午后は『JavaScript高级プログラミング』の第6章を见たばかりで、対象向けのプログラミングは、自分が以前対象向けのプログラミングの基础を持っていなかったので、理解が难しかったのですが、自分の努力で研究+インターネットで资料を调べ+缲り返し実践して、やっと问题の上で理解して、私のプログラミングの思考に対してとても大きい向上でしょう.ここでは学習ノートと心得を出して、後で自分で調べるのに便利です.
    一、理解対象
    JavaScriptでは、すべてがオブジェクトであり、前の学習参照タイプは、基本的にJavaScriptの内蔵オブジェクトであり、基本タイプは、これらの内蔵オブジェクトのインスタンスであり、BOM、DOMもオブジェクトであり、グローバル変数はwindowの属性と見なすことができる.
    JavaScriptを学ぶには、オブジェクトという概念を理解することが最も重要です.私たちのすべての文は、オブジェクトを処理しているからです.
    ECMAScriptの概念では、オブジェクトは、基本値、オブジェクト、または関数を含む無秩序属性の集合として定義されます.
    すべての関数は方法であるべきで、もし関数が開発者が作成したオブジェクトの属性でなければ、それはwindowの属性です.
    二、オブジェクトの作成
    オブジェクトを作成するモードには、ファクトリモード、コンストラクション関数モード、プロトタイプモード、コンビネーションモード、ダイナミックプロトタイプモード、寄生コンストラクション関数モード、および安定コンストラクション関数モードが含まれます.
    1、工場モード
    多くのオブジェクト向け言語ではクラスを使用して対像を作成しており、JavaScriptではクラスの定義はありません.JavaScriptのファクトリモードでは、オブジェクトの作成の詳細が関数にカプセル化され、オブジェクトを作成する必要がある場合に呼び出されます.
    
function createObject(property1,property2,property3){
    var aObject = new Object();
    aObject.property1 = property1;
    aObject.property2 = property2;
    aObject.property3 = property3;
    aObject.method1 = function(){
        do something;
    };
    return aObject;
}

    ファクトリモードの問題は,オブジェクト識別の問題(オブジェクトをどのように識別するか)を解決していないことである.
    2、構造関数モード
    コンストラクション関数モードの考え方は、関数自体もオブジェクトであり、関数にはリロードされた特性がないことを考慮して、関数内部のthisオブジェクトを使用して、オブジェクトを作成する関数に属性と方法を追加し、コンストラクション関数を私たちが望んでいるオブジェクトにすることができます.
    
function AObject(property1,property2,property3){
    this.property1 = property1;
    this.property2 = property2;
    this.property3 = property3;
    this.method1 = function(){
        do something... ;
    };
    }

    コンストラクション関数モードの問題は、コンストラクション関数を使用してオブジェクトを作成するたびに、バックグラウンドで自動的に対応するメソッド関数が作成され、オブジェクトのメソッドが多い場合、バックグラウンドでは同じ関数が多く作成されます.メソッド関数をコンストラクション関数以外に取り出し、コンストラクション関数内部のメソッドで呼び出すと、関数のパッケージング性が失われます.
    3、原型モード
    プロトタイプモードの原理は関数オブジェクトのprototype属性を利用しており、JavaScriptでは各オブジェクトにprototype属性があり、この属性はオブジェクトのプロトタイプを指し、thisタイプのすべてのオブジェクトインスタンスが持つ属性と方法を含む.
    プロトタイプモードは、関数のprototypeプロパティを使用して、このコンストラクション関数に基づくプロトタイプオブジェクトを作成します.このコンストラクション関数を呼び出してオブジェクトインスタンスを作成するたびに、作成したオブジェクトインスタンスは、このprototypeで作成したプロトタイプからプロパティとメソッドを継承します.これにより,構造関数モードが直面する問題を解決した.
function Person(){
    Person.prototype.name = "wan";
    Person.prototype.age = 14;
    Person.prototype.sayName = function(){
        alert(this.name);};
}
var person1 = new Person();
person.sayName();

      Person.Prototype.name="wan";など、属性を定義する文は関数のほかに、字面量構文を使用してプロトタイプに属性やメソッドを追加することもできます.
      プロトタイプ・モードを使用して作成されたオブジェクト・インスタンスは、このプロトタイプ継承プロパティとメソッドを再作成し、インスタンスのプロパティを書き換えます.プロトタイプや他のインスタンスには影響しません.同じ名前のプロパティを作成すると、継承されたプロパティは上書きされますが、プロトタイプや他のインスタンスには影響しません.
       プロトタイプ・モードの問題は、1つのプロパティが配列などの参照タイプである場合、1つのインスタンスのプロパティを変更すると、他のインスタンスとプロトタイプに影響します.
    4、組み合わせモード
    コンビネーションモードは、コンストラクション関数モードとプロトタイプモードを統合した点で、現在最も広く使用されている作成オブジェクトモードです.
    コンビネーション・モードでは、オブジェクト・インスタンスのプライベート・プロパティをコンストラクション関数に配置し、共通のプロパティとメソッドをプロトタイプに配置し、プライバシーとパフォーマンスの要件を満たします.
    
function AObejct(property1,property2,property3){
    this.property1 = property1;
    this.property2 = property2;
    this.property3 = property3;
}
AObject.prototype.property4 = property4;
AObject.prototype.method1 = function(){
    do something... ;
}
var aObject = new AObject();

    5、ダイナミックプロトタイプモード
    組合せモードの1つの問題は、コンストラクション関数とプロトタイプが分離され、ダイナミックプロトタイプはすべての詳細を1つの関数にカプセル化し、if文を使用して、オブジェクトがプロトタイプを持っているかどうかを確認し、プロトタイプをロードする必要があるかどうかを決定することです.
    6、寄生構造関数モード
    寄生コンストラクション関数モードとファクトリモードの唯一の違いは、コンストラクション関数を呼び出す前にnewオペレータを使用することです.
    一般的に、この方法でオブジェクトを作成することはめったにありません.
   7、安定構造関数モード
    セキュリティに対する要求が高い場合、問題コンストラクション関数モードを使用して妥当なオブジェクトを構築できます.妥当なオブジェクトには共通の属性がなく、その方法もthis値を参照しません.
    二、継承
    オブジェクト向けプログラミング中国では,あるオブジェクトが別のIオブジェクトの属性とメソッドを取得する過程を継承する.
    JavaScriptでは,継承は主にプロトタイプチェーンに依存する.
    プロトタイプチェーンの考え方:各オブジェクトにはprototypeプロパティがあります.このプロパティは、このprototypeプロパティを使用してプロトタイプオブジェクトを作成し、別のオブジェクトをこのプロトタイプオブジェクトに等しくし、プロトタイプのインスタンスとなり、インスタンスは元のオブジェクトのプロパティと方法を継承します.インスタンスオブジェクトは、独自のprototypeプロパティを使用して、他のオブジェクトを継承するプロトタイプを作成することもできます.これにより、プロトタイプチェーンと呼ばれる長い継承チェーンが形成されます.
    プロトタイプチェーン継承の使用方法:継承するインスタンスオブジェクトのprototype属性を継承されるオブジェクトの構造関数に等しくすればよい.    
    
    オブジェクトを作成するときのプロトタイプモードと同様に、プロトタイプチェーンにも参照タイプの問題があります.インスタンスの参照タイププロパティを変更すると、プロトタイプや他のインスタンスに影響します.
    2、構造関数を利用する
    コンストラクション関数の考え方は、サブタイプのコンストラクション関数の内部でスーパータイプのコンストラクション関数を呼び出し、呼び出すときに関数地call()またはapply()メソッドを使用し、関数を作成するたびに関数の役割ドメイン内でスーパータイプのコンストラクション関数を呼び出すことです.
    この継承方式は、オブジェクトを作成するときのコンストラクション関数モードと同様に、パフォーマンス上の問題も発生します.
    3、グループ継承
    コンビネーション継承とは、プライベート属性と参照タイプの属性をコンストラクション関数で継承し、共通の属性とメソッドをプロトタイプチェーンで継承することです.これも現在広く応用されている継承方式である.
    4、原型式継承
    プロトタイプ継承は、オブジェクトを作成するファクトリモードと同様に、継承されたプロセスを1つの関数にカプセル化します.この関数では、類似したオブジェクトを大量に作成し、パフォーマンスを考慮する必要のない環境に適用されます.
    5、寄生式継承
    寄生継承モードは、プロトタイプ継承に密接に関連する継承方式であり、プロトタイプ継承を使用した上でオブジェクトを書き換える方法でオブジェクトを強化します.
    6、寄生組合せ式継承
    コンビネーション継承モードは継承中に2回のスーパータイプのコンストラクション関数を呼び出し、場合によっては性能上の要求に合致しないため、寄生コンビネーションモードが現れ、このモードは寄生式継承の継承方式を1つの継承関数にカプセル化し、サブタイプ対象とスーパータイプオブジェクトをパラメータとして使用し、継承のプロセスは1回の継承関数を呼び出すだけである.