javascript basics #5 생성자, 연산자 new
https://javascript.info/ 를 참조하여 작성된 글입니다.
비슷한 오브젝트들을 많이 만들 필요가 있을 때, 생성자 함수인 "new"
연산자를 사용할 수 있다.
기술적으로는 일반 함수이지만, 두가지정도 제약사항이 있다.
"new"
연산자에 의해 실행되어야 한다.function Person(name) {
this.name = name;
this.isGenius = false;
}
let person = new Person("Jake");
alert(user.name);
alert(user.isGenius);
위 함수가 new
키워드와 함께 실행될 때, 다음과 같은 과정을 거친다.
this
에 할당된다.this
에 새로운 프로퍼티를 추가한다.this
의 값이 반환된다.코드로 표현하자면 다음과 같은 일이 일어난다.
function Person(name) {
// this = {}; (암묵적으로)
this.name = name;
this.isGenius = false;
// return this; (암묵적으로)
}
그래서 let person = new Person("Jake")
는 다음 코드의 결과와 같다.
let person = {
name: "Jake",
isGenius: false
}
만일 다른 Person
을 추가하고 싶다면 new Person("Other's Name")
과 같이 추가할 수 있다. 이러한 방법은 매번 리터럴을 사용하는 것보다는 훨씬 쓰기도 쉽고 읽기도 쉽다.
한가지 알아둬야 할 것은 어떤 함수든 new
키워드와 함께 쓰일 수 있으니 "맨 앞글자가 대문자"와 같은 컨벤션을 확실하게 해두는 편이 좋다는 것이다.
하나의 오브젝트를 만들기 위해서 많은 줄의 코드가 필요할 때, 다음과 같이 생성자 함수 내부에 묶을 수 있다.
let user = new function() {
this.name = "Jake";
this.isGenius = false;
}
위의 생성자는 어디에도 저장되지 않기 때문에 다시 호출될 수 없다. 그래서 이 방법은 하나의 오브젝트를 다시 사용하지 않을 때 캡슐화하는 것을 목표로 한다.
이 문법은 거의 쓰이지 않으니 그냥 넘어가도 무관하다.
함수 내부에서, new
키워드로 호출되었는지 아닌지를 확인하기 위해 new.target
프로퍼티를 활용할 수 있다.
일반적인 함수는 new.target
의 결과가 비어있지만, new
로 호출한 경우에는 함수 자체가 나온다.
이를테면 위와 같다.
new.target
은 아래와 같이 활용할 수 있다.
라이브러리 같은 곳에서 코드를 더욱 유연하게 만들기 위해 사용하기도 한다. 라이브러리 사용자가 실수로 new
키워드를 빼먹더라도 오브젝트가 잘 생성될 것이다.
일반적으로 생성자는 return
키워드를 잘 사용하지 않는다. this
에 할 일들을 하고 this
가 반환된다.
만일, return
키워드가 사용된다면 규칙은 다음과 같다.
return
된다면, this
대신에 오브젝트가 반환된다.return
된다면, 무시된다.위와 같은 두가지 생성자 함수가 있을 때,
결과는 아래와 같다.
오브젝트를 반환하던 생성자 함수는 new
연산자를 사용해도 기존에 작성해둔 오브젝트가 반환되고, primitive를 반환하던 생성자 함수는 new
연산자를 사용하니, this
를 잘 반환했다.
생성자 함수에서 괄호를 생략하면, 아규먼트로 아무것도 입력하지 않은 것과 동일한 결과가 나온다.
생성자 함수에서 this
키워드는 프로퍼티 뿐만 아니라 메소드에도 사용할 수 있다.
일례로 아래의 소스코드는 name
프로퍼티와 whoAmI
메소드를 모두 갖고 있는 오브젝트를 만든다.
function Person(name) {
this.name = name;
this.whoAmI = function() {
console.log(`my name is ${this.name}`);
}
}
위와 같이 호출이 가능하다. 이것보다 더욱 업그레이드된 class
라는 문법이 있는데, 나중에 다뤄보도록 할 것이다.
new
라는 키워드와 함께 호출되어야 한다. new
키워드는 비어있던 this
에 프로퍼티와 메서드를 넣고 반환하겠다는 의미를 내포한다.