# Constructor (생성자)
function Boseok(age) {
this.age = age;
}
그냥 함수로 호출하는것과, new 연산자로 객체를 생성하는것에 무슨 차이가 있는지 볼까여?
const boseok = Boseok(123);
console.log(boseok.age); //error
당연히 예상처럼 함수에 리턴하는게 없으므로 boseok객체는 undefined입니다.
그래서 age를 참조할수없는 에러를 뿜어냅니다.
하지만 new 연산자를 사용하면 다르게 작동합니다.
const boseok = new Boseok(123);
console.log(boseok.age); //123
new 연산자를 사용하면 함수를 생성자로 호출합니다. 명시적인 return 구문이 없다면, this가 가리키는 객체를 반환합니다.
new Boseok()은 Boseok.prototype을 상속받은 new 연산자를 사용하여 Boseok 객체의 인스턴스를 생성합니다.
그래서 또 다른 방법으로 인스턴스를 생성하는 방법은 아래와 같습니다.
Object.create(Boseok.prototype)
생성자에 객체를 만들어서 명시적으로 return하면 new 연산자에 관계없이 동작하는 생성자를 만들 수 있습니다.
new 키워드가 빠졌을때 발생하는 this 참조 에러를 예방할 수 있습니다.
팩토리를 사용했을때는 위처럼 장점도 있지만, 단점도 존재합니다.
prototype으로 메소드를 공유하지 않으므로 메모리를 좀 더 사용한다.
팩토리를 상속하려면 모든 메소드를 복사하거나 객체의 prototype에 객체를 할당해 주어야 한다.
new 키워드를 누락시켜서 prototype chain을 끊어버리는 것은 아무래도 언어의 의도에 어긋난다.
# new 연산자와 관계없이 동작하게 만들기
생성자는 new 연산자와 관계없이 동작하는게 좋습니다.
위에서 활용했던 코드를 수정해보겠습니다.
/* 기존코드
function Boseok(age) {
this.age = age;
}
*/
function Boseok(age) {
const self = this.instanceof Boseok ? this : Object.create(Boseok.prototype);
self.age = age;
return self;
}
이런식으로
# 빌트인객체에서의 constructor (new 연산자)
Number(10)
new Number(10)
결론부터 이야기하자면 new 키워드와 함께 Number 같은 기본 타입의 생성자를 호출하면 객체를 생성하지만 new 없이 호출하면 형 변환만 시킨다.
const num = Number(10);
const numObj = new Number(10);
console.log(typeof num); // number
console.log(typeof numObj); // object
console.log(num === numObj); // false
빌트인객체에 프로토타입을 추가하고 new 연산자를 썼을때, 안썼을때, Array.from으로 유사배열을 배열로 바꾼경우를 모두 확인해봤다.
Array.prototype.test = 'test';
const arr1 = Array(10); // [empty x 10]
const arr2 = new Array(10); // [empty x 10]
const arrayLike = {
length: 3,
0: 'boseok',
1: 'boseok1',
2: 'boseok2',
};
const arr3 = Array(arrayLike);
const arr4 = new Array(arrayLike);
const arr5 = Array.from(arrayLike);
console.log(arr3.test); //test
console.log(arr4.test); //test
console.log(arr5.test); //test
유사배열을 형변환하려면 Array.from을 사용해야한다. 변환되지않는다.
프로토타입까지 공유하는걸봐서 빌트인객체에서는 형변환 외에 차이가없는것같다.
← 코딩 가이드 & 팁 자바스크립트 코어 →