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


コンストラクション関数は、new演算子とともに呼び出されてオブジェクトを生成する関数です.コンストラクション関数によって生成されるオブジェクトをインスタンスと呼びます.
Objectジェネレータ関数のほか、JavaScriptにはString、Number、Boolean、Function、Array、Date、RegExp、Promiseなどのビルダー関数が用意されています.

オブジェクトジェネレータ関数

  • new Object()
  • 空のオブジェクトを生成し、
  • に戻る.

    コンストラクタ


    オブジェクトテキストからオブジェクトを作成するには

  • 直感的、簡便
  • オブジェクトを1つだけ作成する=>同じプロセスの複数のオブジェクトを作成する必要がある場合、効率が低下します.
  • コンストラクション関数によるオブジェクトの作成

  • 同じエンティティ構造を持つ複数のオブジェクト
  • を簡単に作成できます.
    定義は
  • の一般関数と同じで、new演算子呼び出しを使用します.
  • インスタンス作成プロセス


  • インスタンスを作成してバインドする
    デフォルトでは、空のオブジェクトが作成され、このオブジェクトにバインドされます.したがって、コンストラクション関数内部のthisは、コンストラクション関数に新しいインスタンスが現れることを意味します.
    この処理は、実行時より前に実行されます.

  • インスタンスの初期化
    このインスタンスにバインドされたpropertyまたはメソッドを追加し、パラメータとして渡された初期値をインスタンスpropertyに割り当てます.

  • インスタンスを返す
    インスタンスバインドが完了したthisはデフォルトで返されます.
    非thisオブジェクトを明示的に返すと、この戻りは無視され、戻り文で指定したオブジェクトが返されます.
  • function Circle(radius) {
      // 1. 인스턴스 생성과 this 바인딩
      
      // 2. 인스턴스 초기화
      this.radius = radius;
      this.getDiameter = function() {
        return 2 * this.radius;
      };
      
      // 3. 인스턴스 반환 => 암묵적으로 this 반환
      return {}; // 다른 객체를 명시적으로 반환 => this 반환 무시
    }
    ただし、明示的に元の値を返すと、元の値は無視され、デフォルトではthisが返されます.
    コンストラクション関数の内部でthis以外の値を明示的に返すと、コンストラクション関数の基本的な動作が破壊されます.したがって、コンストラクション関数の内部ではreturn文を省略する必要があります.

    内部メソッドと構成

  • 関数もオブジェクトであるため、通常のオブジェクトの内部スロットを有し、内部メソッド
  • を有する.
  • は、「環境」、「FormalParameters」など、関数オブジェクトにのみ使用される他の内部スロット、および「コール」および「構成」などの他の内部メソッドです.
  • 一般関数
  • を呼び出す.
    呼び出し
  • [Construct]=>コンストラクション関数
  • すべての関数は呼び出すことができるため、「コール」がありますが、「構成」はコンストラクション関数でなければなりません.

    コンストラクション関数と非コンストラクション関数の区別

  • JavaScriptエンジンは、関数オブジェクト作成時の関数定義に基づいて
  • に分割する.
  • コンストラクション関数:関数宣言、関数式、クラス
  • 非構造関数:メソッド(ES 6メソッド略)、矢印関数
  • // 아래와 같이 일반 함수로 정의된 함수만이 constructor
    
    // 함수 선언문
    function foo() {}
    // 함수 표현식
    const bar = function() {};
    const baz = {
      x: function() {} // x 값으로 할당된 것은 일반 함수로 정의된 함수 => 메소드 X
    };
    // non-constructor
    
    // 화살표 함수
    const arrow = () => {};
    const obj = {
      x() {} // ES6 메소드 축약 표현
    };

    new.target


    新しい演算子
  • を使用することなく、
  • コンストラクタの呼び出しを防止する.
  • コンストラクタ内部で使用するデフォルト領域変数
  • 関数で=>new演算子とコンストラクション関数を使用して
  • を呼び出す.
    // 생성자 함수
    function Circle(radius) {
      // new와 함께 호출하지 않았다면 new.target 은 undefined
      if (!new.target) {
        // new 연산자와 함께 생성자 함수 재귀 호출하여 반환
        return new Circle(radius);
      }
      
      this.radius = radius;
      this.getDiameter = function() {
        return 2 * this.radius;
      };
    }
    ほとんどのコンストラクタ関数は、new演算子とともに呼び出されるかどうかを決定するために適切な値を返します.new演算子がなくても、new演算子とともに呼び出されたときの動作と同じです.
    ただし、new演算子を使用せずにString、Number、Booleanコンストラクション関数を呼び出すと、オブジェクトではなく文字列、数値、ブール値が返されます.データ型を変換することもできます.
    const str = String(123);
    console.log(str, typeof str); // 123 string
    
    const num = Number('123');
    console.log(num, typeof num); // 123 number
    
    const bool = Boolean('true');
    console.log(bool, typeof bool); // true boolean