プロトタイプ-1

8321 ワード

JAvascriptはオブジェクトベースのプログラミング言語で、javascriptを構成するほとんどの「すべて」がオブジェクトです.
オブジェクトは,状態データと動作を1つの論理ユニットに組み合わせた複合データ構造といえる.このとき,オブジェクトの状態データをproperty,動作をメソッドと呼ぶ.

継承とプロトタイプ


継承:オブジェクトのpropertyまたはメソッドが他のオブジェクトによって継承され、使用できることを意味します.
JavaScriptはプロトコルタイプに基づいて継承を実現し,不要な重複を排除する.
function Circle(radius){
  this.radius = radius;
  this.getArea = function(){
    	return Math.PI * this.radius ** 2;
  }
}
const circle1 = new circle(1);
const circle2 = new Circle(2);
上記のコードに基づいて、Circleコンストラクション関数によって生成されるすべてのオブジェクトにはpropertyとメソッドがあります.
JavaScriptはプロトコルタイプに基づいて継承を実現します.
function Circle(radius){
  this.radius = radius;
}

// Circle 생성자 함수가 생성한 모든 인스턴스가 getArea 메서드를
// 공유해서 사용할 수 있도록 프로토타입에 추가한다. 
// 프로토타입은 Circle 생성자 함수의 Prototype 프로퍼티에 바인딩되어있다.

Circle.prototype.getArea = function(){
  return Math.PI * this.radius **2;
}
const Circle1 = new Circle(1);
//Circle 생성자 함수가 생성한 모든 인스턴스는 부모객체의 역할을 하는
//프로토타입 Circle.prototype으로부터 getArea 메서드를 상속받는다. 

プロトタイプオブジェクト


プロトコルタイプは、オブジェクトの親としてのオブジェクトであり、他のオブジェクトに共有プロトコルを提供します.
すべてのオブジェクトには、[PRODotype]という名前の内部スロットがあります.この内部スロットの値はプロトタイプの参照です.[PRODotype]に格納されるプロトコルのタイプは、オブジェクトの作成方法によって決まります.つまり、オブジェクトの作成時にオブジェクトの作成方法によってプロトタイプが決定され、[PRODotype]に格納されます.
オブジェクト、プロトタイプ、コンストラクション関数が相互に関連しています.

Protoアクセス者propertyを使用して、独自のprototype、すなわち[prototype]内部スロットが指すprototypeに間接的にアクセスできます.
次に、プロトコルタイプは、独自のコンストラクション関数propertyを介してコンストラクション関数にアクセスでき、コンストラクション関数は、独自のprototype propertyを介してプロトコルタイプにアクセスできます.

proto訪問者property


すべてのオブジェクトはprotoアクセス者propertyを介して自分のprototype、すなわち[prototype]内部スロットに間接的にアクセスできます.
ProtoビジターPropertyは、オブジェクトが直接所有するPropertyではなく、Objectです.プロトタイプのproperty.すべてのオブジェクトが継承されます.prototype.protoアクセス者propertyを使用できます.
const person = {name : "Lee"};

console.log(person.hasOwnProperty("__proto__")); // false

console.log(Object.getOwnPropertyDescriptor(Object.prototype,"__proto__"); //{get:f,set:f,enumerable:false, configurable:ture}
  
console.log({}.__proto__ === Object.prototype); // true     
[PRODototype]の内部スロットの値、すなわちプロトコルタイプにアクセスするには、相互参照によるプロトコルタイプチェーンの生成を防止するために、アクセス者propertyを使用します.
const parent ={};
const child = {};
child.__proto__ = parent;
parent.__proto__ = child;   // 오류 발생 
//프로토타입 체인은 단방향 링크드 리스트로 구현되야 한다. 
コードでprotoアクセス者propertyを直接使用することは推奨されません.
すべてのオブジェクトがprotoアクセス者propertyを使用できるわけではないからです.
例:
const obj = Object.create(null);
objはプロトタイプチェーンの終点である.したがって、オブジェクト.protoを継承できません.