JavaScript constructor return

오픈소스·2020년 12월 31일
0

C++ constructor도 return이 없다.

https://docs.microsoft.com/ko-kr/cpp/cpp/constructors-cpp?view=msvc-160
https://www.geeksforgeeks.org/constructors-c/

생성자는 클래스와 같은 이름을 사용하며 반환 값이 없습니다.

그런데, JavaScript에서는 일반 함수 형태에서 new 연산자와 함께 호출하면 생성자 함수로 동작한다.

function foo() {}

// 일반 함수로서 호출: [[Call]]이 호출된다.
foo();

// 생성자 함수로서 호출: [[Construct]]가 호출된다.
new foo();

https://wikibook.co.kr/mjs/, 17장

function Circle(radius) {
  this.radius = radius;
  this.getDiameter = function () {
    return 2 * this.radius;
  };
}

const circle1 = new Circle(5);
const circle2 = new Circle(10);

console.log(circle1.getDiameter()); // 10
console.log(circle2.getDiameter()); // 20

const circle3 = Circle(15);

console.log(circle3); // undefined
console.log(radius); // 15

함수가 일반 함수로 호출되면 함수 객체의 내부 메서드 [[Call]]이 호출되고, new 연산자와 함께 생성자 함수로서 호출되면 내부 메서드 [[Construct]]가 호출 된다.

JavaScript 인스턴스 반환

암묵적 this 반환

function Circle(radius) {
  // 1. 암묵적으로 빈 객체가 생성되고 this에 바인딩된다.
  
  // 2. this에 바인딩도어 있는 인스턴스를 초기화한다.
  this.radius = radius;
  this.getDiameter = function () {
    return 2 * this.radius;
  };
  
  // 3. 완성된 인스턴스가 바인딩된 this가 암묵적으로 반환된다.
}

// 인스턴스 생성. Circle 생성자 함수는 암묵적으로 this를 반환한다.
const circle = new Circle(1);
console.log(circle); // Circle {radius: 1, getDiameter: f}

명시적 객체 반환

function Circle(radius) {
  // 1. 암묵적으로 빈 객체가 생성되고 this에 바인딩된다.
  
  // 2. this에 바인딩도어 있는 인스턴스를 초기화한다.
  this.radius = radius;
  this.getDiameter = function () {
    return 2 * this.radius;
  };
  
  // 3. 암묵적으로 this를 반환한다.
  // 명시적으로 객체를 반환하면 암묵적인 this 반환이 무시된다.
  return {};
}

// 인스턴스 생성. Circle 생성자 함수는 명시적으로 반환한 객체를 반환한다.
const circle = new Circle(1);
console.log(circle); // {}

명시적 원시 값 반환

function Circle(radius) {
  // 1. 암묵적으로 빈 객체가 생성되고 this에 바인딩된다.
  
  // 2. this에 바인딩도어 있는 인스턴스를 초기화한다.
  this.radius = radius;
  this.getDiameter = function () {
    return 2 * this.radius;
  };
  
  // 3. 암묵적으로 this를 반환한다.
  // 명시적으로 원시 값을 반환하면 원시 값 반환은 무시되고 암묵적으로 this가 반환된다.
  return 100;
}

// 인스턴스 생성. Circle 생성자 함수는 암묵적으로 반환한 this를 반환한다.
const circle = new Circle(1);
console.log(circle); // Circle {radius: 1, getDiameter: f}

따라서 생성자 함수 내부에서 return 문을 반드시 생략해야 한다.


https://wikibook.co.kr/mjs/, 25장

class Person {
  constructor(name) {
    this.name = name;
    
    // 명시적으로 객체를 반환하면 암묵적인 this 반환이 무시된다.
    return {};
  }
}

const me = new Person('Lee');
console.log(me); // {}
class Person {
  constructor(name) {
    this.name = name;
    
    // 명시적으로 원시 값을 반환하면 원시 값 반환은 무시되고 암묵적으로 this가 반횐된다.
    return 100;
  }
}

const me = new Person('Lee');
console.log(me); // Person { name: "Lee" }

따라서 constructor 내부에서 return 문은 반드시 생략해야 한다.

0개의 댓글