constructor function


関数式プログラミングに没頭していましたが、オブジェクト向けプログラミングにも興味を持ち、いつかJavaを試してみようと思って探してみました.

constructor function


英語から何かを生成する関数であることがわかります
一般的には、複数の類似オブジェクトを生成するために使用される関数です.
function User(name) {
  this.name = name;
  this.isAdmin = false;
}

let user = new User("보라");

alert(user.name); // 보라
alert(user.isAdmin); // false
returnはありませんが、どのようにして値を生成しますか?
コンストラクション関数には、関数の頭文字を大文字にする規則があります.
その後、この関数内でthis = {}というオブジェクトが暗黙的に生成され、最後にreturn thisという戻り文が暗黙的に生成される.
function User(name) {
  // this = {};  (빈 객체가 암시적으로 만들어짐)

  // 새로운 프로퍼티를 this에 추가함
  this.name = name;
  this.isAdmin = false;

  // return this;  (this가 암시적으로 반환됨)
}
では、returnをコンストラクション関数に書き込むとどうなるのでしょうか.
二つの状況に分けられる.
  • オブジェクトを返すと、return thisは暗黙的に作成されません.
    function BigUser() {
    
      this.name = "원숭이";
    
      return { name: "고릴라" };  // <-- this가 아닌 새로운 객체를 반환함
    }
    
    alert( new BigUser().name );  // 고릴라
  • オリジナルを返すと、暗黙的にreturn thisが生成される
    function SmallUser() {
    
      this.name = "원숭이";
    
      return; // <-- this를 반환함
    }
    
    alert( new SmallUser().name );  // 원숭이
    📌 new.targetコンストラクション関数が呼び出されたかどうかを決定するnew operator
    function User() {
      alert(new.target);
    }
    // 'new' 없이 호출함
    User(); // undefined
    // 'new'를 붙여 호출함
    new User(); // function User { ... }
    ES 6で作成されたclassのため、コンストラクション関数は使用されません.

    *References

  • new演算子と構造関数