new 연산자와 생성자 함수
new - JavaScript | MDN
new 연산자는 개발자로 하여금
- user-defined object type의 객체를 생성하거나,
- 생성자 함수가 있는 built-in object type의 객체를 생성할 수 있도록 해준다.
1. Syntax
new constructor
new constructor()
new constructor(arg1)
new constructor(arg1, arg2)
new constructor(arg1, arg2, /* …, */ argN)
constructor
- A class or function that specifies the type of the object instance.
- 이처럼 JavaScript에서 생성자constructor는 특정한 “객체 타입”을 정의하는 클래스 또는 함수를 의미한다는 것을 기억하자. (동일 구조를 가진 인스턴스를 찍어내는 틀이라고 볼 수 있다)
- (1. “객체 타입”이라는 개념, 그리고 2. 생성자로서 클래스와 함수 두가지가 가능하다는 점)
- 클래스는 사실 함수라고 한다. class
arg1, arg2, …, argN
- A list of values that the
constructor will be called with. new Foo is equivalent to new Foo(), i.e. if no argument list is specified, Foo is called without arguments.
- 리턴값에 대한 내용은 2-0.의 4번 참고.
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
const car1 = new Car('Eagle', 'Talon TSi', 1993);
console.log(car1.make);
// Expected output: "Eagle"
2. Description
2-0. new의 역할과 constructor
- 함수(클래스 포함. 클래스도 함수니까)가
new 키워드와 함께 호출되면, 함수는 constructor로서 사용된다. 이때 new는 다음과 같은 일을 한다:
- 비어있는 일반 JS 객체를 생성한다. 편의상 이를
newInstance라고 하자.
- 만약 생성자 함수의
prototype 프로퍼티가 객체라면, newInstance의 [[Prototype]]이 prototype을 가리키도록 한다. 그렇지 않다면, newInstance 는 일반 객체로 유지된다([[Prototype]]이 Object.prototype을 가리키게 된다)
- 이 덕분에 생성자 함수에 정의한 프로퍼티와 메소드를 해당 생성자 함수로 생성한 인스턴스들이 사용할 수 있는 것이다. 3-2. Using a constructor(function, including class) ⇒ 여기 문서에 정리되어 있는 것처럼, 프로토타입 관점으로 본다면, 생성자 함수의 사용(즉,
new constructor)은 Object.create 방법과 함께 객체에 프로토타입을 설정하여 생성하는 한가지 방법으로 볼 수 있다.
- 참고로 모든 함수는 생성 시에 기본적으로(by default) 빈 객체를 가진
prototype 프로퍼티를 가진다. 만약 객체가 아닌 prototype 프로퍼티 값을 가진 함수가 있다면 아마 이전에 해당 값이 조작되었다는 것이다. (생성자) 함수를 정의하면 자동으로 .prototype프로퍼티에 constructor라는 프로퍼티 하나만 가진 객체가 할당되는데, 이 constructor프로퍼티는 반대로 생성자 함수를 가리킨다. 예를들면 아래와 같다.
- 주어진 인자를 가지고 생성자 함수를 실행한다. 이때
newInstance를 (생성자 함수의) this context로서 바인딩한다. (i.e. 생성자 함수 내부의 this는 이제 newInstance를 참조한다(가리킨다))
- 만약 생성자 함수가 non-primitive 값을(즉 객체를) 리턴한다면, 이 값이 전체 new expression이 리턴하는 값이 된다. 그렇지 않다면(즉 값을 리턴하지 않거나, 원시 값을 리턴한다면),
newInstance (this라고 생각할 수도 있다)를 리턴하게 된다.
- 일반적으로 생성자는 값을 리턴하지 않는 경우가 대부분이다. 정말 필요한 경우에만 override 하면 된다.
- 클래스는
new 연산자를 통해서만 사용할 수 있다. new 없이 클래스를 호출하면 TypeError가 발생한다.
constructor functions
- 하나의 객체는 객체 리터럴
{…}을 사용해 만들 수 있다.
- 유사한 객체를 여러개 만들어야 할때는 생성자 함수를 만들어 사용할 수 있다.
- 생성자 함수와 일반 함수를 정의할때 기술적인 차이는 없지만, 식별자 이름에 대한 관례와 호출시 차이점이 있다.
- 생성자 함수 이름의 첫글자는 대문자로 시작한다. (관례)
- 생성자 함수로서 호출 시에는
new 키워드를 붙인다.
2-1. Adding a new property
- 생성한 객체 인스턴스에는 언제나 프로퍼티를 추가할 수 있다.
- 예를들어 car1.color = “black” 을 하면 car1 객체 인스턴스에 color라는 프로퍼티를 추가하고 그 값을 “black”으로 지정할 수 있는 것이다.