
new 연산자와 생성자 함수를 사용하면 유사한 객체를 쉽게 생성할 수 있다. 이를 통해 개발자는 코드의 재사용성과 가독성을 높일 수 있다.
new 연산자를 붙여 실행해야 한다.new를 붙여 생성자 함수를 호출하면 다음과 같은 동작이 수행된다:
1. 빈 객체가 생성되고, this에 할당된다.
2. 함수 본문이 실행되며, this에 프로퍼티와 메서드가 추가된다.
3. this가 반환된다.
function User(name) {
this.name = name;
this.isAdmin = false;
}
let user = new User("보라");
console.log(user.name); // "보라"
console.log(user.isAdmin); // false
위 예제는 다음과 동일한 객체를 생성한다:
let user = {
name: "보라",
isAdmin: false
};
재사용할 필요가 없는 복잡한 객체는 익명 생성자 함수를 사용해 캡슐화할 수 있다.
let user = new function() {
this.name = "John";
this.isAdmin = false;
// 복잡한 로직 추가 가능
};
new.target과 생성자 함수new.target을 사용하면 함수가 new와 함께 호출되었는지 확인할 수 있다.
function User() {
console.log(new.target);
}
User(); // undefined
new User(); // function User { ... }
new로 변환function User(name) {
if (!new.target) {
return new User(name);
}
this.name = name;
}
let user = User("보라");
console.log(user.name); // "보라"
return문이 없으면 자동으로 this가 반환된다.return에 따라 반환 결과가 달라질 수 있다:this가 반환된다.function BigUser() {
this.name = "원숭이";
return { name: "고릴라" };
}
console.log(new BigUser().name); // "고릴라"
function SmallUser() {
this.name = "원숭이";
return;
}
console.log(new SmallUser().name); // "원숭이"
인수가 없는 생성자 함수 호출 시 괄호를 생략할 수 있다:
let user = new User; // new User()와 동일
생성자 함수를 사용하면 매개변수로 객체의 프로퍼티와 메서드를 동적으로 정의할 수 있다.
function User(name) {
this.name = name;
this.sayHi = function() {
console.log(`제 이름은 ${this.name}입니다.`);
};
}
let user = new User("보라");
user.sayHi(); // "제 이름은 보라입니다."
new 연산자를 사용하면 내부적으로 this가 생성되어 반환된다.다음 조건을 만족하는 함수 A와 B를 작성하라:
function A() { ... }
function B() { ... }
let a = new A;
let b = new B;
console.log(a == b); // true
let obj = {};
function A() { return obj; }
function B() { return obj; }
alert( new A() == new B() ); // true