TIL[プロトタイプ]



プロトタイプとは?


1.プロトタイプVS Class


過去のクラスがjavascriptに現れる前に、クラスの機能がプロトタイプです.クラスがないため完全な継承機能がなく,それを実現するためにプロトタイプを用いた.

2.私たちはいつ原型を使いますか。


クラスがない場合は、クラスの代わりに関数とnewキーワードで記述します.
function Car(){
  this.wheel = 4;
  this.mirror = 2;
}

let car1 = new Car();
let car2 = new Car();

car1.wheel // 4
car1.mirror // 2
car2.wheel // 4
car2.mirror // 2
ここでの問題は、新しいインスタンスを作成するたびにwheelとmirrorが生成されることです.今は大丈夫ですが、実例が多ければ多いほど、車輪や鏡も多くなります.これらの問題を解決するためにprototypeを使用することができます.
function Car(){
 
}

Car.prototype.wheel = 4;
Car.prototype.mirror = 2;

let car1 = new Car();
let car2 = new Car();

car1.wheel // 4
car1.mirror // 2
car2.wheel // 4
car2.mirror // 2
各関数には、プロトタイプと呼ばれる特殊なオブジェクトがあります.だから、カール.prototypeという名前のオブジェクトもメモリのどこかに存在します.つまり、wheelとmirrorというキーを設定し、その値をそれぞれ4と2に入れます.ここでは、すべての関数にプロトタイプオブジェクトが存在します.これが次の内容です.

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


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

function Car() {} // => 함수
let car1 = new Car(); // => 함수로 객체를 생성
car 1というオブジェクトはcarという関数によって生成される.このように、すべてのオブジェクトは関数で作成されます.私たちがよく使う相手も同じです.
let obj = {};  
let obj = new Object();
上の2つは同じ言い方です.すなわちobjオブジェクトはobjectという内蔵関数で作成されるオブジェクトである.Objectという名前の組み込み関数では、すべての関数がObjectです.prototypeという名前のオブジェクトは、toStringやvalueOfなどの組み込みメソッドを含むメモリ内のどこかに存在するため、objにはこれらのメソッドを別途入力する必要はありません.オブジェクトと同様に、関数と配列は関数によって生成されます.
この内容は、プロトタイプオブジェクトとどのように関連していますか?関数を定義するときに起こる2つのことを理解すればよい.
1.この関数にConstructor(作成者)の資格を付与します.
Constructor資格が付与されている場合は、newでオブジェクトを作成できます.
function Car() {} // => 함수
let car1 = new Car(); // => 함수로 객체를 생성
2.この関数のプロトタイプオブジェクトの作成と関連付け
関数を定義すると、その関数のプロトタイプオブジェクトも一緒に作成され、両方が関連付けられます.生成された関数はprototypeという属性でプロトタイプオブジェクトにアクセスできるようになりました.プロトタイプオブジェクトは通常のオブジェクトと同じで、基本的に構造関数とprotoというプロトタイプがあります.


ここで重要なのはカールですprototype.constructorとは、Car関数そのものを指します.プロトタイプオブジェクトのコンストラクション関数は、プロトタイプオブジェクトのペアリング関数を指します.
function Car(){
 
}

Car.prototype.wheel = 4;
Car.prototype.mirror = 2;

let car1 = new Car();
let car2 = new Car();

car1.wheel // 4
car1.mirror // 2
car2.wheel // 4
car2.mirror // 2
通常のオブジェクトと同様に、プロトタイプオブジェクトは任意にプロトタイプを追加および削除できます.car 1とcar 2はcar関数によって作成されるのでcar.プロトタイプを参照できます.

プロトタイプリンク


car 1とcar 2にはwheelとmirror属性はありませんが、car 1です.車輪または自動車ミラーできます.それはcar 1,car 2が持つproto属性のためである.すべての関数が「プロトタイプ」というオブジェクトを生成するように、すべてのオブジェクトにはprotoというプロパティがあります.protoとは、オブジェクトを作成する際に使用される関数のプロトタイプオブジェクトです.

実際には、コンソールウィンドウでcar 1を検索する.protoはCarです.原型を指し示す.

car 1オブジェクトにはwheelおよびmirrorというpropertyは直接存在しないため、親prototypeオブジェクトが参照されます.上位Object関数のプロトタイプオブジェクトを表示していない場合はundefinedを返します.このように、オブジェクトのproto属性によって親プロトタイプオブジェクトに直接接続され、最終的にオブジェクト関数のプロトタイプオブジェクトに到達し、プロトタイプチェーン(prototype chain)と呼ばれる.

プロトタイプチェーン

function Human(name){
  this.name = name;
}
let steve = new Human('steve');
steve.__proto__ === Human.prototype;  // true
steve.__proto__.__proto__ === Object.prototype; // true
steve.toString() 
// 우리가 toString 이라는 메서드를 직접 선언해 주지 않아도 쓸 수 있는 이유는 
// Object라는 최상위 객체의 프로토 타입 객체에 __proto__로 접근해서 그 안의 toString 메서드를 가져왔기 때문이다.

すべてのオブジェクトがオブジェクトを継承するため、オブジェクト.プロトタイプで定義したプロトタイプメソッドを使用できます.

プロトタイプの利用


1.偽シナリオの作成

let MyArray = function(){

}
MyArray.prototype = Array.prototype;
// Array도 함수이기 때문에 프로토 타입 객체가 존재
// MyArray함수의 프로토 타입 객체에  Array함수의 프로토 타입 객체를 할당
let myarr = new MyArray(); // 객체 생성자를 통해 객체 생성
myarr.push(1); // MyArray[1]
myarrは配列ではありませんが、配列のように動作します.