プロトタイプ


継承とプロトタイプ


プロトタイプはJavaScriptで継承を実現するために作成されます.
function Square(x) {
  this.x = x;
  this.getArea = function () {
    return this.x **2;
  };
}

const s1 = new Square(5);
const s2 = new Square(6);

console.log(s1.getArea());//25
console.log(s2.getArea());//36
console.log(s1.getArea === s2.getArea);//false
Squareインスタンスを作成するたびにgetAreaメソッドが作成され、すべてのインスタンスがgetAreaメソッドを繰り返し使用します.これは性能もメモリもよくありません.
プロトタイプを使用して、次の変更を行うことができます.
function Square(x) {
  this.x = x;
}

Square.prototype.getArea = function () {
  return this.x ** 2;
};

const s1 = new Square(5);
const s2 = new Square(6);

console.log(s1.getArea()); //25
console.log(s2.getArea()); //36
console.log(s1.getArea === s2.getArea); //true
Squareコンストラクション関数のプロトタイプにgetAreaメソッドを追加しました.
getAreaメソッドは1回のみ作成され、Squareコンストラクション関数のすべてのインスタンスはgetAreaを継承して使用できます.

コンストラクタ、プロトタイプ、オブジェクト


ジェネレータ関数、プロトタイプ、オブジェクトを1つのグループと見なします.JavaScriptでは、ほとんどがオブジェクトです.各オブジェクトにはプロトタイプがあり、各プロトタイプには構造関数があります.
すべてのオブジェクトに[Prototype]という内部スロットがあります.オブジェクトを作成すると、プロトタイプが決定され、スロットに割り当てられます.内部スロットに直接アクセスすることはできませんが、__proto__というアクセス者プログラムを使用してプロトコルタイプにアクセスできます.prototypeは、コンストラクション関数propertyを介してコンストラクション関数にアクセスできます.
上記のSquareを例にとると、以下のような構成といえる.
Square {
	protorype : Square.prototype
}

Square.prototype {
	constructor : Square
}

s1 {
	[[Prototype]] : Square.prototype을 가리킴(직접 접근불가)
   	__proto__: Square.prototype
}
直接出力は以下の通りです.
function Square(x) {
  this.x = x;
}

Square.prototype.getArea = function () {
  return this.x ** 2;
};

const s1 = new Square(5);

console.log(s1.__proto__);//{ getArea: [Function (anonymous)] }
console.log(s1.__proto__.constructor);//[Function: Square]
s 1ではprotoの平方を通ります.原型に近づく.
Square.prototypeでは、コンストラクション関数を使用してSquareコンストラクション関数にアクセスします.

プロトタイプチェーン


上のprotoは訪問者propertyです.ではprotoはどこから来たのでしょうか.
protoはオブジェクトです.プロトタイプのアクセス者プログラム.
プロトタイプのプロトタイプは常にオブジェクトです.原型です.オブジェクトにアクセスするプロパティがない場合、JavaScriptは[PRODetype]スロットの参照順に親として機能するプロパティを検索します.これを프로토타입 체인といいます.
上記の例では、検索プロセスは次のようになります.
  • で作成されたs 1オブジェクトでprotoを検索します.
  • がない場合は、s 1の[Prototype]のSquareにバインドされます.prototypeでprotoを検索します.
  • がなければSquareです.Prototypeの[Prototype]にバインドされているオブジェクト.prototypeでprotoを検索します.