new 연산자
와 함께 호출해서 객체를 생성하는 함수
직관적이고 간편하나, 단 하나의 객체만 생성할 수 있다.
-> 동일한 프로퍼티를 갖는 객체를 여러 개 생성해야 하는 경우 매번 같은 프로퍼티를 기술해야 하기 때문에 비효율적임
객체는 프로퍼티를 통해 객체의 상태, 메서드를 통해 객체의 동작을 표현한다. 프로퍼티는 객체마다 프로퍼티 값이 다를 수 있지만, 메서드는 내용이 동일한 경우가 일반적이다.
-> 객체 리터럴로 객체를 생성하는 경우, 프로퍼티의 구조가 동일함에도 불구하고 매번 같은 프로퍼티와 메스드를 기술해야 하낟.
템플릿처럼 생성자 함수를 사용해서 프로퍼티 구조가 동일한 객체 여러 개를 간편하게 생성할 수 있다.
// 생성자 함수 Person 선언
function Person(name) {
this.name = name;
this.getPersonName = function () {
return `Hi, My Name is ${this.name}`;
};
}
// new 연산자와 함께 Person 객체(인스턴스) 생성
const person1 = new Person("Soyeon");
const person2 = new Person("Jisoo");
// 각 Person 객체의 메서드 호출
console.log(person1.getPersonName()); // Hi, My Name is Soyeon
console.log(person2.getPersonName()); // Hi, My Name is Jisoo
new 연산자
와 함께 호출하면new 연산자
와 함께 생성자 함수를 호출하지 않으면, 일반 함수로 동작한다.프로퍼티 구조가 동일한 인스턴스를 생성하기 위한 템플릿으로서,
인스턴스를 생성 (필수) + 생성된 인스턴스를 초기화 (옵션)
fuction Person(name) {
// 1. 암묵적으로 인스턴스가 생성되고 this에 바인딩된다.
console.log(this); // Person {}
this.name = name;
this.getName = function () {
return `Hi, My Name is ${this.name}`
}
}
fuction Person(name) {
// 1. 암묵적으로 인스턴스가 생성되고 this에 바인딩된다.
// 2. this에 바인딩되어 있는 인스턴스를 초기화한다.
this.name = name;
this.getName = function () {
return `Hi, My Name is ${this.name}`
}
}
fuction Person(name) {
// 1. 암묵적으로 인스턴스가 생성되고 this에 바인딩된다.
// 2. this에 바인딩되어 있는 인스턴스를 초기화한다.
this.name = name;
this.getName = function () {
return `Hi, My Name is ${this.name}`
}
// 완성된 인스턴스가 바인딩된 this가 암묵적으로 반환된다.
}
// 인스턴스 생성. Person 생성자 함수는 암묵적으로 this 를 반환한다.
const person = new Person('soyeon');
console.log(person); // Person { name: 'soyeon', getName: f }
자바스크립트에서 함수는 객체이지만 일반 객체와 다르다.
-> 일반 객체는 호출 불가능, 함수는 호출 가능
함수 객체는 일반 객체가 가지고 있는 내부 슬롯과 내부 메서드,
함수 객체만을 위한 [[Environment]], [[FormalParameters]] 등의 내부 슬롯과 [[ Call ]], [[ Construct ]] 같은 내부 메서드를 추가로 가지고 있기 때문이다.
함수가 일반 함수로 호출되면
-> 함수 객체 내부 메서드 [[Call]] 호출
-> 함수 객체 내부 메서드 [[Construct]] 호출
[[Call]] 을 갖는 함수 객체 -> Callable = 호출할 수 있는 객체, 함수
[[Construct]] 을 갖는 함수 객체 -> Constructor = 생성자 함수로서 호출할 수 있는 함수
new 연산자와 함께 함수를 호출하면 해당 함수가 생성자 함수로 동작한다.
[[Construct]]
가 호출됨construcotr
이어야 한다.ES6에 도입되어, new 연산자와 함께 생성자 함수로서 호출되었는지 확인할 수 있다.
// 생성자 함수
function Person(name) {
// 이 함수가 호출되면, 가장 먼저 new 연산자와 함께 호출된 것인지 확인
if (!new.target) {
// new 연산자와 함께 호출된 것이 아니면, 함수 내부에서 재귀로 new 연산자와 함께 Person 생성자 함수를 호출
return new Person(name);
}
this.name = name;
this.getName = function () {
return `Hi, My Name is ${this.name}`;
};
}
// new 연산자 없이 생성자 함수를 호출
const person = Person("soyeon");
console.log(person.getName());
IE와 같은 new.target을 지원하지 않는 브라우저에서 생성자 함수를 확인하는 방법