Js에서 object 생성자 함수 호출해서 만든 객체랑,
객체 리터럴로 만든 객체는 new.target을 확인하는 부분이 다르대 그거에 대해 설명해줘
JS에서 Object 생성자 함수를 호출하여 객체를 생성하는 경우, 생성자 함수 내부에서 new.target을 사용하면 new 연산자를 통해 생성자 함수가 호출된 경우에는 생성자 함수를, 함수로서 호출된 경우에는 undefined를 반환합니다. 예를 들어, 다음과 같이 Object 생성자 함수를 호출하여 객체를 생성하면 new.target은 Object 생성자 함수를 반환합니다.
function Person(name) {
if (new.target === Person) {
this.name = name;
} else {
throw new Error("You must use new keyword to create Person object");
}
}
const person1 = new Person("John");
console.log(person1.name); // "John"
const person2 = Person("Tom"); // throws an error
반면 객체 리터럴을 사용하여 객체를 생성하는 경우, new.target은 undefined를 반환합니다. 객체 리터럴은 단순히 중괄호 {}를 사용하여 객체를 생성하기 때문에, 생성자 함수로 호출되지 않으며 new.target은 undefined를 반환합니다.
const person = {
getName: function() {
console.log(new.target); // undefined
return this.name;
},
name: "John"
};
console.log(person.getName()); // undefined "John"
따라서 객체 리터럴을 사용하여 객체를 생성하는 경우에는 new.target을 사용하여 생성자 함수를 체크하는 것이 불가능합니다.