function User(name) { // 생성자 함수
this.name = name;
this.isAdmin = false;
}
let user = new User("보라"); // new 연산자로 user라는 객체 생성
alert(user.name); // -> 보라
alert(user.isAdmin); // -> false
실행 프로세스
1. new User("보라");
실행 시, 빈 객체가 생성된다.
2. 생성된 빈 객체가 this
에 할당된다.
3. 생성자 함수 User 본문이 실행됨에 따라 빈 객체this에 프로퍼티가 추가된다.
4. 생성자 함수가 끝나면, 완성된 this 객체가 반환되며, 변수 user
에 담긴다.
따라서 생성자 함수의 숨겨진 로직을 뜯어보면 다음과 같다.
fucntion 함수명(인자) {
// this = {}; -> 빈 객체 생성해서 this에 할당
this.키1 = 값1; // -> 객체에 property 추가
this.키2 = 인자;
// return this -> 완성된 객체를 반환
생성자는 재사용할 수 있는 객체 생성 코드를 만들기 위해 존재한다.
모든 함수는 생성자가 될 수 있다. 호출 시 앞에 new
만 붙인다면 생성자 함수의 프로세스로 실행된다.
let user = new function() {
this.name = "John";
this.isAdmin = false;
// 사용자 객체를 만들기 위한 여러 코드.
};
new
와 함께 호출되었는지 여부를 알 수 있음undefined
반환이를 활용해서, 생성 코드 함수임에도 불구하고 new
를 빠트리고 호출을 하는 경우를 대비할 수도 있다.
function User(name) {
if (!new.target) { // new 없이 호출해도
return new User(name); // new를 붙여줍니다.
}
this.name = name;
}
let bora = User("보라"); // 'new User'를 쓴 것처럼 바꿔줍니다.
alert(bora.name); // 보라
return 객체
: this 대신 객체를 반환한다. return 원시형
: 무시하고 this를 반환한다. 예시 :
function BigUser() {
this.name = "원숭이";
return { name: "고릴라" }; // this가 아닌 새로운 객체 반환
}
alert( new BigUser().name ); // 원숭이가 아닌!!! 고릴라 출력
생성자 함수 내부에서는
객체 this에 일반적인 property를 추가해줄 수도 있고,
method를 추가해줄 수도 있다!
예시 :
function User(name) {
this.name = name; // property 추가
this.sayHi = function() { // property를 활용한 method 추가
alert( "제 이름은 " + this.name + "입니다." );
};
}
let bora = new User("이보라");
bora.sayHi(); // 제 이름은 이보라입니다.
name : "이보라"
가 추가되고, sayHi : function() { ~ }
도 추가된다. bora.sayHi();
실행 시, bora가 참조하는 객체의 sayHi 메소드가 실행되고, 그 내부에서 현재 객체의 name 값인 "이보라" 가 대입되어 출력된다.