JavaScriptは、プロトタイプの継承に広く使用されている唯一の言語であるため、2つの継承方法の違いを理解するには時間がかかります。
最初の大きな違いは、JavaScriptがプロトタイプチェーンを使用して継承することです。
function foo(){this.value = 42;} foo.prototype = {method:function(){}}; function bar(){}BarのプロトタイプをFooのオブジェクトインスタンスに設定します。
bar.prototype = new foo(); bar.prototype.foo = 'hello world';
バーのコンストラクターがそれ自体であることを確認し、新しいバーオブジェクトインスタンスを作成してください。
bar.prototype.constructor = bar; var test = new bar();
プロトタイプチェーン全体の構成を見てみましょう。
テスト[barのインスタンス] bar.prototype [fooのインスタンス] {foo: 'hello world'} foo.prototype {method:...} object.prototype {toString:... / * etc. * /}上記の例では、オブジェクトテストはbar.prototypeとfoo.prototypeの両方を継承します。したがって、FOOで定義された関数メソッドにアクセスできます。もちろん、プロパティ値にもアクセスできます。新しいbar()が作成されていない場合、新しいfooインスタンスが再利用されますが、そのプロトタイプオブジェクトに付属するFooインスタンスは再利用されます。同様に、すべてのバーインスタンスは同じ値属性を共有します。例を挙げましょう:
test1 = new bar(); test2 = new bar(); bar.prototype.value = 41; test1.value // 41 test2.value // 41
プロトタイプチェーン検索メカニズム
オブジェクトのプロパティにアクセスすると、JavaScriptは、対応するプロパティが見つかるまで、オブジェクト自体からプロトタイプチェーン全体を通過します。上記の例のプロトタイプであるプロトタイプチェーンのトップに到達した場合、属性が見つかりません。JavaScriptは未定義の値を返します。
プロトタイプオブジェクトのプロパティ
プロトタイプオブジェクトのプロパティは、JavaScriptによってプロトタイプチェーンを構築するために使用されますが、それでも値を割り当てることができます。しかし、プロトタイプに元の値をコピーすることは無効です。
function foo(){} foo.prototype = 1; //効果はありませんこの記事からの気晴らしと、元の価値とは何かを紹介します。
JavaScriptでは、変数は2種類の値、つまり元の値と参照値を保存できます。
1。プリミティブ値:
元の値は固定値と単純な値であり、スタックに保存されている単純なデータセグメントです。つまり、その値は、変数にアクセスされる場所に直接保存されます。
原始的なタイプには、未定義、ヌル、ブール、数字、文字列の5つのタイプがあります。
2。参照値:
基準値は比較的大きなオブジェクトであり、ヒープのヒープに保存されているオブジェクト、つまり変数に保存されている値は、オブジェクトが保存されているメモリを指すポインターポインターです。すべての参照タイプはオブジェクトから統合されています。
プロトタイプチェーンのパフォーマンスの問題
見つかる属性がプロトタイプチェーンの上部にある場合、検索プロセスは間違いなくパフォーマンスにマイナスの影響を与えます。これは、パフォーマンス要件が必要なシナリオでは重要な考慮事項になります。さらに、存在しないプロパティを見つけようとすると、プロトタイプチェーン全体が横断されます。
同様に、オブジェクトのプロパティを通過すると、プロトタイプチェーン上のすべてのプロパティにアクセスします。
要約します
プロトタイプの継承を理解することは、より複雑なJavaScriptコードを作成するための前提条件であり、コード内のプロトタイプチェーンの高さにも注意を払う必要があります。パフォーマンスのボトルネックに直面するときは、プロトタイプチェーンを分割することを学ぶ必要があります。さらに、プロトタイプオブジェクトのプロトタイプをプロトタイプ__Proto__と区別するために、ここでプロトタイプオブジェクトのプロトタイプについて主に説明し、プロトタイプ__Proto__に関する問題を説明しません。