
1) object constructor function
// 빈 객체 생성
const student = new Object();
// 프로퍼티 추가
student.name = '유관순';
student.age = 20;
1) constructor function
function Student(name, age){
// 생성자 함수 내부의 this는 생성자 함수가 생성할 인스턴스를 가리킨다.
this.name = name;
this.age = age;
this.getInfo = function(){
return `${this.name}(은)는 ${this.age}세 입니다.`;
}
}
// 인스턴스의 생성
const student4 = new Student('장보고', 35);
const student5 = new Student('신사임당', 40);
2) instance creation proccess
function Student(name, age){
// 1. 암묵적으로 인스턴스가 생성 되고 this에 바인딩 되는 과정이 런타임 이전에 실행 된다.
console.log(this);
// 2. this에 바인딩 되어 있는 인스턴스를 초기화 한다.
this.name = name;
this.age = age;
this.getInfo = function(){
return `${this.name}(은)는 ${this.age}세 입니다.`;
}
// 3. 완성 된 인스턴스가 바인딩 된 this가 암묵적으로 반환된다.
// return {};
// 만약 명시적으로 객체를 반환하면 암묵적인 this 반환이 무시된다.
// return 1;
// 하지만 명시적으로 원시값을 반환하면 무시되고 this가 반환된다.
// 생성자 내부에서 return은 생략하는 것이 기본이다.
}
const student = new Student('홍길동', 20);
3) differences from regular function
일반 함수와의 차이점
일반 함수와의 형식적인 차이는 없다
function Student(name, age){
this.name = name;
this.age = age;
this.getInfo = function(){
return `${this.name}(은)는 ${this.age}세 입니다.`;
}
}
// 일반 함수로 호출 된 Student는 반환문이 없으므로 undefined를 반환
const studenet = Student('강감찬', 35);
console.log(studenet);
/* 일반 함수로 호출 된 Student 내의 this는 전역 객체를 가리킴. */
console.log(age);
console.log(name);
console.log(getInfo());
생성자 함수가 new 연산자 없이 호출 되는 것을 방지하기 위해 ES6에서는 new.target을 지원한다.
function Dog(name, age){
if(!new.target){
// new 연산자와 함께 호출 되지 않은 경우 undefined 이므로
// new 연산자와 함께 생성자 함수를 재귀 호출 하여 생성된 인스턴스를 반환
return new Dog(name, age);
}
this.name = name;
this.age = age;
}
// new 연산자 없이 호출해도 new.target을 통해 생성자 함수로서 호출 된다.
const dog = Dog('뽀삐', 3);
console.log(dog);
대부분의 빌트인 생성자 함수(Object, String, Number, Boolean, Date...) 는 new 연산자와 함께 호출 되었는지 확인 후 적절한 값을 반환한다.
String, Number, Boolean의 경우 new 연산자 없이 호출하면 객체 값이 아닌 문자열, 숫자, 불리언 값(원시값)을 반환한다.