プロトタイプ


JavaScriptはプロトコルベースの言語です.
クラスベースの言語では継承が使用され、プロトタイプベースの言語ではプロトタイプ(prototype)としてオブジェクトを使用して複製され(継承と同様の効果が得られます(参照).

プロトタイプの概念


プロトタイプはオブジェクトです.
JavaScriptは自動的に関数にオブジェクトprototype propertyを作成します.この関数をコンストラクション関数として使用すると(新しい演算子とともに呼び出されます)、生成されたインスタンスに非表示のproperties __proto__が自動的に作成されます.このpropertyは、コンストラクション関数のprototype propertyを参照します.
たとえば、Personというコンストラクション関数のプロトタイプにgetNameというメソッドを指定したとします.
const Person = function(name) {
  this.name = name;
};

Person.prototype.getName = function() {
  return this.name;
};
Personインスタンスは、__proto__プロトコルを使用してgetNameを呼び出すことができます.インスタンスの__proto__は、構造関数のプロトタイプpropertyを参照するため、最終的には同じオブジェクト向けである.
const jaewon = new Person("jaewon");
jaewon.getName(); // "jaewon"
__proto__ 프로퍼티를 통해 getName을 호출할 수 있습니다.jaewon.__proto__.getName();を呼び出さなくても正常に動作するのは、__proto__が省略可能なpropertyであるためです.
開発者ツールのコンソールを見てみましょう.
const arr = [1, 2];
console.dir(arr);
console.dir(Array)

以上の画像は出力結果の一部です.
左側はarr変数を出力した結果です.最初の行はArray(2)とマークされます.Arrayという名前のコンストラクション関数が作成され、その長さは2であることがわかります.
今右を見て
最初の行には、関数を表すfが表示されます.2行目から関数を含む基本プロパティArray関数の静的メソッドfrom,isArray,ofなども見られる.
prototypeを開くと、左の__proto__と全く同じ内容で構成されています!これは、インスタンスの__proto__ propertyが構造関数のプロトタイプpropertyを参照していることを明確に示している.

プロトタイプチェーン


次に、オブジェクトの内部構造を見てみましょう.console.dir({ a: 1 });
最初の行からObjectの例がわかり、Property aの値1がわかります.コンストラクション関数は、コンストラクション関数としてのオブジェクトを指します.__proto__は、オブジェクトのプロトタイプpropertyを参照する.
今回は並びの仕組みを見てみましょう.
__proto__には__proto__も登場し、客体の__proto__と同じ内容だった.どうしてこんなことになったの?プロトタイプオブジェクトが「オブジェクト」だからです.デフォルトでは、すべてのオブジェクトの__proto__にオブジェクトが含まれています.プロトタイプが接続されています.
このように、あるデータの__proto__において、__proto__プロトコルはプロトコルチェーンとも呼ばれ、そのチェーンに沿って探索することをプロトコルチェーンと呼ぶ.
メソッドを呼び出すと、JavaScriptエンジンはデータ自体のプロパティを検索し、必要なメソッドがあれば実行します.ない場合は__proto__を検索し、実行します.ない場合は__proto__を再度検索します.

オブジェクトメソッドのみの例外


どのコンストラクション関数でもPrototypeはオブジェクトでなければならないのでObject.プロトタイプは常にプロトタイプチェーンの最上位に位置します.食物連鎖の観点から見ると、食物連鎖の最上位です.したがって、オブジェクトでのみ使用するメソッドは、プロトタイプオブジェクトでは定義できません.Objectはオブジェクトにしか使用できないからです.Prototype内部で定義されている場合は、他のデータ型でもこのメソッドを使用できます.

以上のような理由から、対象に対してのみの対象専用方法が対象とならざるを得ない.原型でないオブジェクトには静的メソッドでのみ付与できます.逆に、Object.Prototypeは、任意のデータに使用できるいくつかの一般的な方法しかありません.
コアJavaScript(ソース)