[JS]プロトタイプに基づくオブジェクト向け

3746 ワード

JavaScriptは、コマンド、関数、プロトコル・タイプに基づくオブジェクト向けプログラミングをサポートするマルチプログラミング言語です.
JAvascriptはオブジェクトベースのプログラミング言語で、javascriptを構成するほとんどの「すべて」がオブジェクトです.(元のタイプの値を除き、他の値はオブジェクトです.)
オブジェクト向けのプログラムは,実世界を認識する哲学的思考に基づいてプログラミングされる.
ここで、エンティティはオブジェクト(Object)として表され、エンティティが持つ様々な特徴または性質はオブジェクト内の属性(Attribute/Property)として表される.
抽象化とは、開発者が「人」という名前のオブジェクト内に「名前」、「アドレス」という属性を指定し、これらの属性を集約して表現することです.
const person = {
	name: "Lee";
    	address: "Seoul";
};
オブジェクト内では、オブジェクトの状態を表すデータと操作可能なデータとの動作が1つの論理ユニット(オブジェクト)に結合される.ステータスデータを属性,動作をメソッドと呼ぶ.
オブジェクトは、固有の可能性のある独立したコンポーネントと見なすことができますが、他のオブジェクトと関係を持つこともできます.データを処理し、ステータスデータやアクションを継承して使用することもできます.
継承とプロトタイプ
継承(継承)->既存の定義されたオブジェクトの基本情報とメソッドを他のオブジェクトに使用できるようにします.
これにより、不要なコードの重複が解消されます.
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의 생성자 함수는 인스턴스를 생성할 때마다 동일한 동작을 하는 
//getArea 메서드를 중복생성하고 모든 인스턴스가 중복 소유한다. 
console.log(circle1.getArea === circle2.getArea); //false

console.log(circle1.getArea());  //3.141592...
console.log(circle2.getArea());  //12.566370...
上記のコードでCircleオブジェクトを複数回作成すると、作成するたびに同じ操作を実行するgetAreaがcircleの各オブジェクトに格納され、メモリが過剰に消費されます.このような不要な浪費を避けるために、
継承によってオブジェクトよりも高いオブジェクトを作成してメソッドをロードしようとすると、getAreaの各インスタンスに不要なストレージ領域を減らすことができますか?
この概念の導入はプロトタイプの存在の主な原因である.
function Circle(radius) {
	this.radius = radius;
};

Circle.prototype.getArea = function () {
	return Math.PI * this.radius ** 2;
};

const circle1 = new Circle(1);
const circle2 = new Circle(2);

//Circle 생성자 함수가 생성한 모든 인스턴스는 부모 객체의 역할을 하는
//프로토타입 Circle.prototype으로부터 getArea 메서드를 상속받는다. 
console.log(circle1.getArea === circle2.getArea); //true

console.log(circle1.getArea());  //3.141592...
console.log(circle2.getArea());  //12.566370...
Circleのコンストラクション関数によって作成されるすべてのインスタンスは、親としてのCircleという独自のプロトタイプです.プロトタイプのすべてのpropertyとメソッドを継承します.
これにより、各インスタンスに必要な一意のデータ・プロセスが個別に保持され、同じ操作を実行する方法は、継承によってプロトコル・タイプから取り出して使用できます.
これはメモリの観点から非常に有用であり、複数のインスタンスを効率的に作成することができます.
プロトタイプオブジェクト
すべてのオブジェクトには、[PRODotype]という名前の内部スロットがあります.この内部スロットの値はプロトタイプの参照です.
各オブジェクトにはプロトタイプがあり、オブジェクトの作成方法によって[Prototype]に格納されているプロトタイプが決まります.すべてのプロトタイプはコンストラクション関数に関連付けられています.__proto__ビジタープロパティ
[PRODotype]は内部スロットに直接アクセスできませんが、__proto__のビジターPropertyから間接アクセスできます.__proto__は、Prototypeという内部スロット値にアクセスできるビジタープロフェッショナル版であり、他のビジタープロフェッショナル版と同様にGet、Setプロフェッショナル版がある.__proto__を値の読み込みに使用する場合、getter関数を呼び出してオブジェクトのタイプを取得し、値の割り当てに使用する場合、setter関数を呼び出してオブジェクトのタイプを置き換えます.
const obj = {};
const parent = {x:1};

//get함수 호출 obj 객체의 프로토타입을 반환
obj.__proto__; 

//set함수 호출 obj 객체의 프로토타입을 parent로 교체
obj.__proto__ = parent'

console.log(obj.x); //1
__proto__は、オブジェクトが直接所有するプロジェクトではありません.プロトタイプのproperty.すべてのオブジェクトは、Object.prototype.__proto__アクセス者プログラムを継承することによって使用することができる.Object.prototypeは、すべてのオブジェクトがバンドルされた階層、プロトタイプチェーンの最上位の終点にあるオブジェクトであり、そのオブジェクトのPropertyおよびメソッドは、すべてのオブジェクトの作成をすぐに継承します.
(すべてのオブジェクトの始祖と根本のように)__proto__は、相互参照によってプロトタイプチェーンがループに陥ることを防止するために使用される.親オブジェクトのプロトタイプが子オブジェクトとして指定されている場合、プロトタイプチェーンはねじれ、一方向リンクのリストとして実装されません.ループ参照の場合、prototypeでpropertyを検索すると無限ループに陥るため、__proto__アクセス者propertyによるprototypeへのアクセスと置換が実現される.
でもすべてのオブジェクトはObjectプロトタイプは継承されないため、__proto__アクセス者プログラムのコード内で使用することは推奨されません.プロトタイプの参照を取得するには、__proto__メソッドを使用することを推奨し、プロトタイプを置き換えるにはObject.getPrototypeOfメソッドを使用することを推奨します.(IE 11以降のサポート)