객체 생성자의 함정
객체 리터럴을 사용할 수 있는 상황에서는 new Object()
생성자를 쓸 이유가 없지만, 다른 사람이 작성한 레거시 코드를 물려받을 수도 있기 때문에 이 생성자의 '기능'하나를 알아둘 필요가
있습니다.
결국 이는 생성자를 써서는 안되는 이유이기도 합니다.
문제의 기능은 Object()
생성자가 인자를 받을 수 있다는 점입니다.
인자로 전달되는 값에 따라 생성자 함수가 다른 내장 생성자에 객체 생성을 위임할 수 있고, 따라서 기대한 것과는 다른 객체가 반환되기도 합니다.
다음은 new Object()
에 숫자, 문자열, 불린 값을 전달한 몇 가지 예입니다.
예상한 바와 다른 생성자로 생성된 객체가 반환됩니다.
JavaScript
// 경고 : 모두 안티 패턴이다.
// 빈 객체
var obj = new Object();
console.log(obj.constructor === Object); // true 가 기록
// 숫자 객체
var obj = new Object(10);
console.log(obj.constructor === Number); // true 가 기록
obj.toFixed(2); // 1.00 이 기록
// 문자열 객체
var obj = new Object('I am a string');
console.log(obj.constructor === String); // true 가 기록
// 일반적인 객체에는 substring() 이라는 메서드가 없지만 문자열 객체에는 있다.
console.log(typeof obj.substring); // function 이 기록
// 불린 객체
var obj = new Object(true);
console.log(obj.constructor === Boolean); // true 가 기록
Object()
생성자의 이 같은 동작 방식 때문에, 런타임에 결정하는 동적인 값이 생성자에 인자로 전달될 경우 예기치 않은 결과가 반환될 수도 있습니다.
거듭 말하자만 결론적으로, new Object()
를 사용하지 마라.
더 간단하고 안정적인 객체 리터럴을 사용하는 것을 권장합니다.
Jaehee's WebClub
'JavaScript > JS 객체지향 프로그래밍' 카테고리의 다른 글
모듈화와 모듈 패턴(module pattern) #2 (1) | 2016.10.14 |
---|---|
module pattern (모듈패턴) #1 (2) | 2016.10.14 |
함수의 프로토타입(prototype) 핵심 정리 (0) | 2016.10.05 |
클래스 기반(일반 언어)과 프로토타입(자바스크립트) 기반 비교 (0) | 2016.09.29 |
절차 지향 방식에서 객체지향 방식(함수기반 클래스,프로토타입방식 클래스) 으로 리팩토링하기 (0) | 2016.09.29 |