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]]가 호출 된다.
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 문은 반드시 생략해야 한다.