JSコアシリーズ:プロトタイプオブジェクト

オブジェクトに建てられたF1は、試作品を含む、プロパティのいくつかである時はいつでもJSでは、関数オブジェクトを作成するプロト、プロトタイプ、プロトタイプオブジェクト。

各コンストラクタは、オブジェクトは、プロトタイプオブジェクトと呼ばれ、オブジェクトと関連付けられています。
オブジェクトの各インスタンスは、それらの特性およびプロトタイプオブジェクトのメソッドを共有することができます。
オブジェクトがメモリ割り当てを減らす、プロトタイプのオブジェクトプロパティのインスタンスを共有することができるように、継承プロパティを実装するためのプロトタイプオブジェクトの主な役割。
だから、前のセクションでは、我々はこの方法を達成することができ、各Personオブジェクトで言う方法を共有したいと思います。
人関数(名前、年齢){
this.name =名;
this.age =年齢;
} //関数のプロトタイプオブジェクト、共有機能のオブジェクトのインスタンス言う追加
Person.prototype.say =関数(){
にconsole.log( "挨拶");
}; VAR Pは=人新しい新規( "ZS"、10)と言う。
p.sayを(); VAR新しい新しいP2 =人物( "ZS"、10、たとえば);
p2.say()。
プロトタイプオブジェクトにメンバーを追加する方法
。コンストラクターのメンバーは、メンバーの名前=値.prototype;
Personがプロトタイプオブジェクトを言うための添加方法の後に、複数のインスタンスで共有方法の実装は、機能オブジェクト。
:プロトタイプオブジェクトの取得方法
コンストラクタ.prototypeする
。インスタンスオブジェクトをプロト
オブジェクトの各インスタンスには、持っているプロト・プロトタイプオブジェクト属性がオブジェクトを取得するために使用されます。
== P Person.prototype。プロト ; //真の
図では、オブジェクト間の関係を詳細:

ここに画像を挿入説明
コアオブジェクト指向の概念
コンストラクタ:人、そして新しいキーワードでオブジェクトを作成し
、コンストラクタのプロトタイプオブジェクト:Person.prototype、
プロトタイプオブジェクト:オブジェクトとインスタンスのコンストラクタを作成する相互
インスタンスオブジェクトを:コンストラクタで作成されましたたとえば、呼び出されたオブジェクト
のインスタンス化:作成プロセスのインスタンスは、コンストラクタでインスタンス化によって呼び出される
+メソッド属性:オブジェクトのメンバー
インスタンスメンバー:インスタンスオブジェクト、名前、年齢、オブジェクトの現在のインスタンスのみのプロパティとメソッドアクセスの
原型メンバー:プロトタイプオブジェクトのプロパティとメソッドは、(言う)、コンストラクタにプロトタイプオブジェクトの対応を使用して、オブジェクトのすべてのインスタンスが出て作成しアクセスすることができる
静的メンバー:直接コンストラクタでプロパティとメソッドを追加し、使用のみアクセスするには、コンストラクタ
プロトの属性が記述
属性指定はこれだけ前ES6、ブラウザの実装の一部のみの後に含まれています。
このプロパティは、指定されたインスタンスオブジェクトのプロトタイプオブジェクト、P.取得してもよいプロトを取得しPerson.prototypeのよう
プロトタイプオブジェクトgetPrototypeOf我々はまた、指定されたインスタンスオブジェクトを取得するオブジェクトのコンストラクタ(インスタンスオブジェクト)メソッドを使用することができる
3種類の上記のプロトタイプオブジェクトのメソッドは、得られた結果は同じです取得します。すなわち:
。Object.getPrototypeOf(P)P == == Person.prototype プロトが
組み込みオブジェクト拡張
組み込みオブジェクトはJSに予めオブジェクト定義され、使用されているオブジェクトは、直接そのような被験体に、使用することができ、良好なパッケージを有しています簡単に基本的な機能を実行するために、開発者を有効にするメソッドとプロパティのヒープ、。
しかし、これらのプロパティやメソッドの実際の開発では、当社のニーズを満たすことができない場合があり、その後、我々はこれらの組み込みオブジェクトへの拡張を行う必要があります。
需要:オブジェクトを配列要素番号の取得方法を追加
ARR1 =のVARが、VaRのARR2は、[ "A"、 "B"、 "C"、 "D"] =である[1、2 ,. 3]
arr1.getLength関数= (){
this.lengthを返す;
}はconsole.log(arr1.getLength());
上記アレイARR1その要素の数を取得するためのgetLength()メソッドを追加し、そのオブジェクトARR2この方法の場合はありますか?私たちはすべて知っている答えであると信じています。あなたはARR2にしたい場合は、同じ機能を持っているだけでなく、同じ操作を必要としています。
それが望ましい。このように、このような機能をしたいために、アレイ100が必要な場合は、操作がより複雑です。
前回学んだ知識によると、我々はこの問題を解決するためにプロトタイプを使用することができます。
ARR1 = VAR [1,2 ,. 3。]; VARのARR2は= [ "A"、 "B"、 "C"、 "D"]; Array.prototype.getLength =関数(){
this.lengthを返す;
}コンソール。ログ(arr1.getLength()); // 3console.log(arr2.getLengthは()); // 4
我々は、配列のプロトタイプオブジェクトに直接のgetLength()メソッドを追加し、すべての後に作成されたオブジェクトの配列を持っています取得する方法!
このアプローチは、私たちの問題を解決することができますが、問題はまだあります。

  1. あなたがこの方法を使用する場合は、多人数開発環境では、組み込みオブジェクトは、他の開発者への影響の可能性を広げます
  2. あなたがプロトタイプオブジェクトにあまりにも多くのメンバーを追加する場合は、検索対象のメンバーの効率が低下します。
    拡張内蔵のオブジェクトセキュリティ
    組み込みオブジェクト上でいくつかの問題を拡張するための重要な方法は、実際には、問題は、我々は、オブジェクトを使用する他の開発者への影響につながる、オブジェクトの上に直接構築されたプロトタイプを拡大することであるということです。
    だから、私たちのアイデアは、オブジェクトが組み込みオブジェクトを拡張する必要性を継承するように、カスタムオブジェクトを解決することであり、そして唯一の指定されたオブジェクトで動作する必要がありますすることができます。
    MyArrayという関数(){
    } //方向付けメイクプロトタイプMyArrayという// Arrayオブジェクトは、すべてのメンバを継承すなわちアレイ
    MyArray.prototype =新しい新しいArray();
    MyArray.prototype.getLength =関数(){
    戻りthis.length;
    } VAR = ARR1()の新しい新MyArrayという。
    arr1.push( ""、 "B"、 "C"、 "D"、 "E"); //最初の組み込みオブジェクトのメソッドはconsole.log(arr1.getLength())。
    //拡張メソッドの後にあなたがするアレイを拡張したい場合は、次の、我々は唯一の直接操作アレイを必要とせずに、MyArrayという缶を操作する必要があるので、他の開発者は影響を受け、使用アレイの操作に持っていません。図では理解さ:
    ここに画像を挿入説明
    プロトタイプチェーンの構造図
    オブジェクトの各インスタンスのためにのコンストラクタによって作成される
    各コンストラクタは、デフォルト関連するプロトタイプオブジェクトた
    プロトタイプオブジェクトは、オブジェクト自体であり、それはまた、独自のコンストラクタ有する
    コンストラクタのプロトタイプオブジェクトをデフォルトのプロトタイプオブジェクトも関連付けられている
    上記プロトタイプチェーンと呼ばれる、チェーン・アクセス・アーキテクチャを構成します
    以下は、プロトタイプチェーンPersonオブジェクトとArrayオブジェクトを表しています。

ここに画像を挿入説明
あなたは慎重にこの記事を読めば、私はあなたがプロトタイプはJavaScriptの新しい理解、プロトタイプチェーンを持っていると信じています。あなたはより多くのJS関連の乾燥品をお知りになりたい場合は、私の更新を集中し続けることを忘れないでください!

おすすめ

転載: blog.51cto.com/13007966/2459857