[TIL]JavaScript作成者&プロトタイプ


1.ジェネレータ


new演算子を使用して新しいオブジェクトを生成する関数をコンストラクション関数と呼びます.

2つのオブジェクトがあるとします.

上記の変更は、同じシェイプのすべてのオブジェクトに適用されます.
また,オブジェクト数が多い場合には,オブジェクトの基本的な動作方法を変更すると,同じ趣旨のオブジェクトもすべて変更する.この場合、簡単に言えば、印刷対象のファクトリジェネレータ関数を使用する.

これにより、コンストラクション関数(new Person)で新しいオブジェクトを作成し、挿入したい値や関数を実現できます.

整理する


コンストラクション関数でPerson作成者によって作成された空のオブジェクトがどのようなPropertyとどのようなメソッドを持つべきかを記述することで、オブジェクトが持つ情報と日付を設定できます.

2.prototype



kim、leeという名前のオブジェクトを作成する場合は、Personというコンストラクション関数で操作します.ただし、Personジェネレータが実行されるたびにsumという関数が生成されます.オブジェクトが多ければ多いほど、関数の作成時間が長くなり、メモリも大きくなり、パフォーマンスが低下する可能性があります.
すなわち,ジェネレータでの作成方法は大きな欠点である.
🧨Personという名前のジェネレータを使用して作成されたすべてのオブジェクトが共通の関数と属性を作成できる場合、どのくらい良いですか?
このとき使えるのがPrototypeです.

上記で定義したコード(Person.prototype.sum関数)は、オブジェクトを作成するたびに実行されないため、一度だけ定義するのでメモリも節約できます.
また、複数のオブジェクトのうち1つだけのオブジェクトのsumメソッドを異なる動作にするには、そのオブジェクトのsumメソッドを定義するだけで簡単です.

🎈例を挙げる

Person.prototype.sum = function(){
	return 'prototype: ' + (this.first + this.second + this.third);
} //lee객체는 kim객체처럼 자신이 sum속성을 가지고 있지 않으므로,
생성자인 Person의 프로토타입의 sum메소드를 찾고 실행

const kim = new Person('kim', 10, 20, 30);
const lee = new Person('lee', 10, 10, 10);

kim.sum = function(){
	return 'this: ' + (this.first + this.second + this.third);
    } //kim객체 자신이 sum이라는 속성을 가지고있다는걸 찾고 실행

console.log(kim.sum()); // 결과값 -> this : 60
console.log(lee.sum()); // 결과값 -> prototype : 30

console.log(kim.sum());


kimという名前のオブジェクトのsumメソッドを呼び出すと、まず、オブジェクト自体にsumプロパティがあるかどうかを検索して実行します.
結果値=>this:60

console.log(lee.sum());


leeという名前のオブジェクトはsumという名前のプロパティを検索して実行しますが、ありません.そのため、オブジェクト作成者Personプロトタイプのsumメソッドが検索され実行されます.
結果値=>prototy:30

整理する


「プロトタイプ」とは、メモリに割り当てるのではなく、オブジェクトの作成時にオブジェクトを作成する方法を意味し、作成者の「プロトタイプ」で定義して、他のすべてのオブジェクトの参照用に使用します.これにより、メモリの使用率が向上し、冗長コードの重複が防止され、メンテナンスが容易になります.