17/コンストラクション関数によるオブジェクトの作成


10章では、オブジェクト文字からオブジェクトを作成する方法について説明します.
この章では、コンストラクション関数を使用してオブジェクトを作成する方法について説明します.
コンストラクタ
objectコンストラクション関数
new演算子とともにobjectコンストラクション関数を呼び出すと、空のオブジェクトが生成され、返されます.
(常用しない…常用オブジェクト文字...)
const person = new Object();
+)コンストラクション関数:
new演算子とともに呼び出され、オブジェクト(インスタンス)を作成する関数です.
Objectジェネレータ関数に加えて、String、Number、Function、Array、Dateなどのビルダー関数も用意されています.
オブジェクト文字オブジェクトの作成方法vsジェネレータ関数オブジェクトの作成方法
オブジェクトテキストからオブジェクトを作成する方法は簡単ですが、1つのオブジェクトのみを作成し、同じ輪郭を持つ複数のオブジェクトを作成する必要がある場合は、効率が低下します.
コンストラクション関数を使用してオブジェクトを作成する方法により、同じproperty構造を持つ複数のオブジェクトを簡単に作成できます.
function Circle(radius){
	this.radius = radius;
    this.getDiameter = function() {
    	return 2 * this.radius;
    };
}
// 인스턴스의 생성
const circle1 = new Circle(5);
const circle2 = new Circle(10);
+) this :
これは、オブジェクト自体のpropertyまたはメソッドを参照するための自己参照変数です.
thisが指す値(バインド)は、関数呼び出しの方法に依存します.
通常の関数と同じ方法でコンストラクション関数を定義し、new演算子とともに呼び出すと、コンストラクション関数として動作します.
コンストラクション関数インスタンスの作成プロセス
コンストラクション関数ボディで実行する必要があるアクション:インスタンスを作成する必要があります!,作成したインスタンスの初期化(初期値の追加と割り当て)オプション!
インスタンスを作成および返すコードが表示されません...
JSエンジンはサイレント処理によりインスタンスを生成し,初期化して返す.
次はその沈黙の処理...
// 생성자 함수
function Circle(radius){
	// 1.암묵적으로 빈 객체가 생성되고 this에 바인딩
	// 2.인스턴스 초기화
	this.radius = radius;
    this.getDiameter = function() {
    	return 2 * this.radius;
    };
    
    //3. 암묵적으로 this를 반환한다. 원시값/다른 객체에 따라 반환값이 나뉜다
    return 100; // case1 : 원시값
    return {}; // case2 : 다른 객체
}
  • インスタンスとこのバインドの作成>
  • インスタンス初期化(開発者によって開始)>
  • インスタンスリターン(明示的リターン)
    this以外のオブジェクトが明示的に返されると、返される文で指定したオブジェクトが返されます.
    このとき、元の値を返すと、デフォルトではthisが返されます.
  • 内部メソッド[call]と[構造]

    関数オブジェクトは通常のオブジェクトとは異なります.通常のオブジェクトは呼び出せませんが、関数を呼び出すことができます.
    関数が通常の関数として呼び出されると、関数オブジェクトを呼び出す内部メソッド[call](call)([call]を持つ関数オブジェクトをcallableと呼びます.すべての関数オブジェクトはcallableです.
    new演算子とともにコンストラクション関数として呼び出されると、[construct](construct)が呼び出されます(constructがあるかどうかによってconstructor,non-constructorと呼ばれます)
    コンストラクション関数:関数宣言、関数式、クラス
    non-constructor:メソッド(ES 6サムネイル表示)、矢印関数
    新しい演算子
    new演算子とともに関数を呼び出すと、その関数はコンストラクション関数として動作します.
    (コンストラクション関数として呼び出される場合、関数内部thisはコンストラクション関数が作成するインスタンスを指します)
    逆にnew演算子がない場合にコンストラクション関数を呼び出すと、通常の関数が呼び出されます.
    (通常の関数として呼び出される場合、関数内部のthisはグローバルオブジェクトウィンドウを指します)
    new演算子によって作成されたオブジェクト(インスタンス)は、プロトタイプからコンストラクション関数に関連付けられます.
    ほとんどのコンストラクタ関数(オブジェクト、String、Number、Boolean、Function、Array、Date、RegExp、Promiseなど)は、new演算子とともに呼び出されるかどうかを確認した後、適切な値を返します.
    let obj = new Object();
    console.log(obj); // {}
    
    obj = Object();
    console.log(obj); // {}
    ただし、String、Number、Booleanコンストラクション関数は、new演算子がない場合に呼び出されると、文字列、数値、ブール値が返されます.
    const str1 = new String(123);
    console.log(str1,typeof str1); // 123 object
    
    const str2 = String(123);
    console.log(str2,typeof str2); // 123 string
    new.target
    ES 6は、new演算子なしでコンストラクション関数を呼び出すことを防止するためにこの機能をサポートする.
    これと同様に、コンストラクション関数として使用されるすべての関数の内部では、デフォルトの領域変数とともに使用され、メタプログラムと呼ばれます.
    関数の内部でnew.targetを使用して、コンストラクション関数として呼び出されるかどうかを確認します.
    (new演算子とともにコンストラクション関数として呼び出されると、new.targetは関数自体を指し、通常の関数として呼び出されるとundefined)
    function Circle(radius){
    	// new.target으로 호출 확인. new연산자와 함께 호출되지 않았다면 undefined
        if(!new.target){ 
        	//new연산자와 함께 생성자 함수를 재귀 호출하여 생성된 인스턴스를 반환
        	return new Circle(raidus); 
        }
        this.radius=radius;
        this.getDiameter = function () {
        	return 2 * this.radius;
        };
    }
    // new연산자 없이 생성자 함수를 호출하여도 new.target을 통해 생성자 함수로서 호출된다.
    const func = Circle(5);