본문으로 바로가기

객체 생성자의 함정

객체 리터럴을 사용할 수 있는 상황에서는 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