Prototype Chain


JavaScriptはプロトタイプ言語です.
JavaScriptは根本的に原型言語です.缲り返し発展し、多型言叶になったが、世界に现れたばかりの顷はそうではなかった.時代の発展に伴い,オブジェクト向けプログラミングがプログラミングモデルの主流となり,JavaScriptにおいてもオブジェクト向けプログラミングを行う必要がある.
プロトタイプベースの言語では,OOPを実現するために生じる過程における概念がプロトタイプチェーンである.プロトタイプチェーンにより,プロトタイプ言語でも継承を実現できる.
Prototype
では、原型とは何でしょうか.原型は祖先と言える.私を例にとると、私のいくつかの特徴(主に外見の特徴)や行為は遺伝を通じて、私の両親と両親の両親にさかのぼり、人類の最初の祖先から受け継がれています.私をオブジェクトに置き換えるには、オブジェクトのプロパティまたはメソッドは、親オブジェクトが継承する内容から構成されます.この場合、親オブジェクトはprototypeobjectと呼ばれます.
プロトタイプは、オブジェクトの継承方法とプロパティのテンプレートです.
Prototype Chain
プロトタイプオブジェクトは、親のプロトタイプオブジェクトからメソッドとプロパティを継承できます.親のプロトタイプオブジェクトは、親のプロトタイプオブジェクトから継承できます.こうして、継承はプロトタイプを経て絶えず下りてきて、つながっているのがプロトタイプチェーンです.さらに,prototypeは継承された属性とメソッドを定義したオブジェクトの作成者である.
プロトタイプチェーンの外観
プロトタイプチェーンの概念は今分かりました.では、JavaScriptでどのように実現するのでしょうか.
Pseudoclassical
まずオブジェクトを定義します.このオブジェクトは、将来作成するオブジェクトの一番上にある円形のオブジェクトです.JavaScriptは関数でもオブジェクトです.関数を使用してオブジェクトを作成します.
//Human 이라는 객체를 정의, 이때 객체는 함수로 표현된다.
const Human = function(name) {
	//해당 객체의 속성은 name이 있다.
	this.name = name;
}
	
//해당 객체의 메소드는 eat이 있다.
Human.prototype.eat = function() {
	console.log('냠냠');
}
別のオブジェクトkimを作成します.金さんは人です.したがって、キム氏を規定する時は、最初からすべてのことをする必要はなく、人の基本的な属性と行為にキム氏の特徴を反映すればよい.すなわち,kimオブジェクトはHumanオブジェクトをモデルとして継承すればよい.
//Human에 kim 전달인자를 넣은 인스턴스를 생성하라는 의미
const kim = new Human('kim');

//kim은 정의되어 있는것이 아무것도 없지만 Human의 속성과 메소드를 상속받아 자신의 것처럼 사용할 수 있다.
kim.eat(); //'냠냠'
人は食べ物ばかり食べない.人にはいろいろな活動がある.キムが自分にもやってもらいたいなら、歌を歌うなら、ヒューマンに方法をつければいい!
Human.prototype.sleep = function() {
	console.log('쿨쿨');
}
Human.prototype.sing = function() {
	console.log('라라라~');
}

kim.sleep(); //'쿨쿨'
kim.sing(); //'라라라~'
今度はパークに仕事をあげましょう.寝たり歌ったりするのは私の度胸です.開発者という職業を与えるために、Humanに開発者の属性と方法を追加すべきではないでしょうか.誰もが開発者ではない.人間は開発者を含む概念であり,開発者も人間であるため,開発者は人間の属性や方法を継承することができる.開発者と呼ばれる新しいオブジェクトを作成します!
const Developer = function(name, language) {
	Human.call(this, name);	
	this.language = language;
}

Developer.prototype.think = function() {
	console.log('생각하는중');
}
Developer.prototype.coding = function() {
	console.log('코딩하는중');
}
作成した開発者をparkに継承し、開発者になります.でも重要なのは人間じゃない...これはあまりにも話にならない.開発者に人を継承させ、パークに開発者を継承させてこそ、人と開発者になることができる.
DeveloperオブジェクトからHumanオブジェクトにnameプロパティを接続するにはcallを使用します.
今ここにプロトタイプチェーンが現れました.プロトタイプチェーンを実現するためには,3つの方法が考えられる.

  • Developer.prototype. __proto__でプロトタイプの接続方法
    →この属性は以前のspecがlegacyのように保持されているので、コードから直接アクセスすることは避けるべきです!

  • Developer.原型のヒューマンプロトタイプを再割り当てします.
    →この場合、開発者のインスタンスと開発者との接続は完全に消え、Humanに直接接続されます.

  • Object.create()の使用方法
    →この方法はヒューマンです.Studioプロトタイプのコピー.プロトタイプに接続された概念です.
  • 3つの方法の中で最後の方法が一番だと言える.
    Developer.prototype = Object.create(Human.prototype);
    この方法はヒューマンプロトタイプのコピーを開発します.プロトタイプに接続します.言い換えれば、コンストラクション関数もHumanのコンストラクション関数に関連付けられる.そのため、もう一つの仕事が必要です.開発者の構造関数は開発者に接続しなければならないからです.
    Developer.prototype.constructor = Develper;
    
    const park = new Developer('park', 'javascript');
    
    park.coding() // '코딩하는중'
    park.eat() // '냠냠'
    park.think() // '생각하는중'
    ついに、私たち朴さんは開発者として、コードも考えもできるし、人を食べることもできます.
    ES6 (class, constructor, extends, super)
    プロトコルタイプベースの言語javascriptでは、プロトコルタイプチェーンを使用してオブジェクト向けのプログラミングもできますが、かなり複雑なタスクを実行する必要があります.ES 6は、コードの可読性を向上させ、コードをより意味的に表現する新しい構文を導入した.ES 6文法で偽経典のコードを書き換えましょう!
    class Human {
    	constructor(name) {
    		this.name = name;
    	}
    	eat() {console.log('냠냠')}
    	sleep() {console.log('쿨쿨')}
    	sing() {console.log('라라라~')}
    }
    
    const kim = new Human('kim')
    
    class Developer extends Human{
    	constructor(name, language) {
    		super(name);
    		this.language = language;
    	}
    	coding() {console.log('코딩하는중')}
    	think() {console.log('생각하는중')}
    }
    
    const park = new Developer('park', 'javascript');
    ES 6以前の実施に比べて、より簡単になり、可読性も向上した.
  • classは、既存の関数形式のオブジェクト表現に代わるキーワードです.
  • だからclassは実は「特別な関数」です!classはclass式として定義することもできます.
  • クラス宣言は、既存の関数宣言と比較してエスケープされません.(letと宣言されたclass式でもエスケープは発生しません)
  • クラスコンテキスト内では、常に「use strict」(厳格モード)で動作します.したがって、この項目を使用することに注意してください.(これは自動バインドされません!)
  • コンストラクタはクラスのコンストラクタを明示的に表す.
  • ES 6以前のコンストラクション関数は関数のパラメータで表され、少しぼやけています.
  • 親のコンストラクション関数と同じであれば、コンストラクション関数を省略することができる.extendsは親の作成者も参照するからです.
  • 継承extendsキーワードに圧縮
  • extendsは2つのロールを同時に実行します.
  • Developer.prototype = Object.create(Human.prototype);
  • Developer.prototype.constructor = Developer;
  • は、既存のクラスの属性またはメソッドを追加(拡張)するために意味化される.
  • 親クラスで接続する方法は非常に簡単になります.
  • Human.call(this, name);スーパー(name);に変更します.
  • コンストラクタでは、スーパーキーは1つしか使用できません.または、そのキーを使用する前に呼び出すことができます.