紙にJSプロトタイプとプロトタイプチェーン(図示)を読み取ります

プロトタイプを話す、我々はプロトタイプのいくつかの重要なポイントを理解する鍵である、しなければならない最初の心の中で、次の点を負担する必要があります。

(ヌル以外)1、タイプ(配列、関数、オブジェクト)へのすべての参照が自由に拡張することができる属性。

図2は、すべての属性(とも呼ばれる暗黙的なプロトタイプは、それが一般的なオブジェクトである)「_ _ _ proto_」参照タイプを持っています。

図3に示すように、すべての機能が「プロトタイプ」プロパティいる(明示的なプロトタイプと呼ばれ、それはまた、一般的なオブジェクトです)。

図4に示すように、すべての参照型、その「_ _ _ proto_」コンストラクタの属性ポイント「プロトタイプ」属性。

5オブジェクトのプロパティを取得しようとしたときにオブジェクト自体が存在しない場合、このプロパティは、それは探すために「_ _ _ proto_」プロパティ(コンストラクタのすなわち「原型」プロパティ)に行きます。

その後のポイントは、我々はこれらの点は、プロトタイプとプロトタイプチェーンに理解し、終了していました。

プロトタイプは
のは、プロトタイプの例を見てみましょう。

//これはコンストラクタである
関数はFoo(名前、年齢){
; this.name =名
this.age =年齢;
}
/ *ポイント3によれば、全ての機能がプロトタイププロパティが、このプロパティは、オブジェクトである
によると、次いですべてのオブジェクトが自由に属性を拡張することができる、1ポイント
以下書き込ま* /があるので
Foo.prototype = {
//他の特性を有するプロトタイプオブジェクトは、
関数(){:showname
はconsole.logを(「私は」+これを.nameの); //これは、この関数を実行し、誰と呼ばれていたものを見て時間で
、}
showAge:機能(){
はconsole.log(「そして私は」+ this.age); //これは何を見ています実行時に誰がこの関数を呼び出す
}
}
VARのFn =新しい新しいはFoo(「ボブ」、19)
オブジェクトのプロパティを取得しようとしたとき、オブジェクト自体が存在しない場合、このプロパティ、それはそのに移動します* /
コンストラクタ'プロトタイプ' * /検索する属性
fn.showNameを(); //私はボブだ
fn.showAge(); //そして、私はよ 19


これは、それが十分に理解され、試作品です。では、なぜそれの試作品を使うのか?

我々はこのようにそれを書いた場合、)はFoo(で多数のオブジェクトを作成する場合を想像:

関数はFoo(名前、年齢){
this.name =名。
this.age =年齢;
this.showName =関数(){
はconsole.log(+ this.name "私は");
}
this.showAge =関数(){
にconsole.log(+ this.age "そして私は")。
}
}


だから我々は、リソースの多くを取るでしょうshowNameとshowAge方法を、持っている各オブジェクトの外に作成されました。
プロトタイプは、内部の(このプロパティは一意である)のみコンストラクタ関数のプロパティの割り当て、及びFoo.prototypeプロパティに書き込む方法を与える必要があることによって達成されます。各オブジェクトはshowName、showAgeメソッド内prototypeプロパティを使用して、多くのリソースを節約することができるように。

プロトタイプチェーンは、
プロトタイプチェーンをよりよく理解するため、プロトタイプを理解します。

#####次の単語は、プロトタイプチェーンを理解することができ
、オブジェクトのプロパティを取得しようとすると、ポイント5によると、オブジェクト自体この属性が存在しない場合、それはにコンストラクタ「プロトタイプ」プロパティに行きます探しています。そして、それはプロトタイプ'属性がオブジェクトであるので、それはまた、「_ _ _ proto_」プロパティを持つように。

その後、我々は例を見て:

//コンストラクタ
関数はFoo(名前、年齢){
this.name =名;
this.age =年齢;
}
Object.prototype.toString =関数(){
//これが、この関数呼び出しを行う人を見て時間が何でありますか。
console.log(+ + this.name "私は" "そして私は" + this.age);
}
VARのFn =新しい新しいはFoo( 'ボブの,. 19);
fn.toString(); //私は。暁明私は19と
はconsole.log(fn.toString === Foo.prototype .__プロト__のtoString。); // trueに

はconsole.log(FN .__ proto__ === Foo.prototype)// trueに
はconsole.log(フー.__プロト__ ===のObject.prototype .prototype)trueに//
trueにはconsole.log(のObject.prototype .__プロト__ === NULL)//


それは不思議ではないですか?さんは分析してみましょう。

まず、fnのコンストラクタがfoo()です。だから、:
fn._プロト_ _ _ === Foo.prototype
とFoo.prototypeが通常のオブジェクトであるため、そのコンストラクタは、そう、オブジェクトです:
Foo.prototype._プロト_ _ _ ===のObject.prototype
上記のコードを、私たちはそれが日付のヌルまで、層ごとに上がるだろう、オブジェクト自体が存在しない場合、このメソッドが呼び出され、こののtoString()メソッドは内部のObject.prototypeである知っています。


それにFoo.prototypeを見つける、またはこのメソッドが見つからない、[オブジェクトを呼び出し、その後、のObject.prototypeを探し探しに行きました、といったので、そうするときFNコールのtoString()、JS fnが、このアプローチを見つけることができませんでしたtoString()メソッドで.prototype。


これは、のObject.prototypeのメソッドを呼び出すための機構のプロトタイプチェーンの存在の正確fnのプロトタイプチェーンです。

プロトタイプを使用した場合また、一般的な推奨事項は、内部で_ _ _ _プロトプロパティを書き込まないよう、コンストラクタのprototypeプロパティを記述するための方法で拡張する必要があろう。
---------------------

おすすめ

転載: www.cnblogs.com/skzxcwebblogs/p/11273015.html