Javascript学習ノートの対象編(二):原型の対象

2359 ワード

Javascriptは唯一広く使われているプロトタイプの継承言語ですので、二つの継承方式の違いを理解するには時間が必要です.
最初の主な違いはJavascriptがプロトタイプチェーンを使って継承します.

function Foo() {
 this.value = 42;
}
Foo.prototype = {
 method: function() {}
};
function Bar() {}
BarのプロトタイプをFooのオブジェクト例に設定します.

Bar.prototype = new Foo();
Bar.prototype.foo = 'Hello World';
Barの構造関数が自身であることを確認し、Barオブジェクトの例を新規作成します.

Bar.prototype.constructor = Bar;
var test = new Bar();
次はプロトタイプチェーン全体の構成を見てみましょう.

test [instance of Bar]
 Bar.prototype [instance of Foo]
 { foo: 'Hello World' }
 Foo.prototype
  { method: ... }
  Object.prototype
  { toString: ... /* etc. */ }
上記の例では、オブジェクトtestはBar.prototypeとFoo.prototypeを同時に継承します.したがって,Fooに定義された関数methodにアクセスできる.もちろん、属性valueにもアクセスできます.言及したいのは、new Bar()の場合、新しいFooインスタンスを作成するのではなく、元のオブジェクトが持つFooインスタンスを再利用することである.同様に、すべてのBarインスタンスは同じvalue属性を共有する.例を挙げて説明します.

test1 = new Bar();
 test2 = new Bar();
 Bar.prototype.value = 41;
 test1.value //41
 test2.value//41
プロトタイプチェーン検索メカニズム
オブジェクトの属性にアクセスすると、Javascriptはオブジェクト自体からプロトタイプチェーン全体を巡回して、対応する属性が見つかるまでです.この時点でプロトタイプチェーンの上部に到達した場合、すなわち前述のObject.prototypeは、まだ検索する属性が見つからないまま、Javascriptはundefined値に戻ります.
原型オブジェクトの属性
プロトタイプオブジェクトの属性はJavascriptによってプロトタイプチェーンを構築するために使用されますが、私たちはまだ値を与えられます.ただし、元の値をプロトタイプにコピーするのは無効です.

function Foo() {}
Foo.prototype = 1; // no effect
ここでは、本編の余談を紹介します.オリジナルの値は何ですか?Javascriptでは、変数は二つのタイプの値を保存できます.それぞれ元の値と参照値です.
1.元の値(prmitive value):
元の値は固定で単純な値であり、スタックスタックスタックに格納された簡単なデータセグメントであり、つまり、その値は直接変数アクセスの位置に格納されている.元のタイプは以下の5つのタイプがあります.Unidefined、Null、Boolean、Number、String.
2.引用値(reference value):
参照値は比較的大きいオブジェクトで、ヒープheapに格納されているオブジェクト、すなわち変数に格納されている値はポインタです.  pointerは、記憶対象のメモリを指します.すべての参照タイプはObjectから集められます.プロトタイプチェーンの性能問題
検索が必要な属性がプロトタイプチェーンの上端にあるなら、検索プロセスは性能にとってマイナス影響を与えるに違いない.パフォーマンスが要求される厳しいシーンでは、これは重要な考慮事項となるだろう.また、属性が存在しない場合はプロトタイプチェーン全体を巡回します.同様に、オブジェクトの属性を遍歴すると、すべてのプロトタイプチェーン上の属性がアクセスされます.
締め括りをつける
プロトタイプ継承を理解することはより複雑なJavascriptコードを書く前提であり、同時にコードのプロトタイプチェーンの高さに注意しなければならない.性能のボトルネックに直面する時、プロトタイプのチェーンを分解することをマスターします.また、プロトタイプとプロトタイプを入れようとします.プロト.区分すると、ここでは主に原型の対象となるプロトタイプについては述べない.プロト.の問題になりました