객체 생성: Object - OOP JavaScript

대부분의 객체지향 언어와는 달리 자바스크립트에서 클래스라는 개념이 없다. 대부분의 객체지향 언어에서는 어떤 클래스의 인스턴스를 생성하지만 자바스크립트에서는 그렇지 않다. 자바스크립트에서는 한 객체가 새로운 객체를 생성할 수 있고 다른 객체에서 무언가를 상속받을 수도 있다. 이러한 개념을 프로토타입 상속(prototype inheritance)이라 부르고 여기에 관해서는 추후 "public 메서드" 절에서 더 논의한다.

자바스크립트의 객체가 어떻게 생겼든 새로운 객체를 만드는 방법이 있어야 한다. 자바스크립트에서는 함수도 객체가 될 수 있게 해 이를 해결한다. 이렇게 설명하니, 여러분이 헷갈릴 것 같다. 좀더 쉽게 설명하자면, 자바스크립트에서 객체를 만드는 일은 쿠키를 찍어내는 판(객체 프로토타입)에 반죽(생짜 객체)를 넣어 어떤 모양을 만들어 내는 것과 같다.

무엇이 어떻게 돌아가는지 아래의 코드에 있는 예를 통해 살펴보자.



간단한 객체를 하나 생성하고 사용하기

							// 이름을 하나 받아서 현재 콘텍스트에 저장하는 간단한 함수
							function User (name) {
								this.name = name;
							}

							// 이름을 주면서 함수의 새 인스턴스를 생성한다.
							var me = new User("My Name");

							// 이름이 me의 프로퍼티로 설정된 것을 볼 수 있다.
							alert(me.name == "My Name");

							// 그리고 me가 User 객체의 인스턴스임을 알 수 있다.
							alert(me.constructor == User);

							// 단순히 보면 User()가 함수이므로,
							// 함수 취급을 하면 어떻게 될까?
							User("Test");

							// 이 함수의 this 콘텍스트가 설정되지 않았기 때문에
							// 콘텍스트는 기본적으로 전역 변수 'window'가 된다.
							// 그 결과 주어진 이름과 window.name이 같아진다.
							alert(window.name == "Test");
						

상기의 예제 코드에서 constructor 프로퍼티를 사용하는 예를 보았다. 이 프로퍼티는 모든 객체에 들어 있으며 항상 객체를 생성한 함수를 가리킨다. 이런 식으로, 기반 클래스는 같지만 프로퍼티는 다른 새로운 객체를 효과적으로 복제할 수 있다. 아래의 코드틑 이와 관련된 한 예이다.

me 객체의 생성자 함수는 User이다. me의 constructor 프로퍼티는 User를 가리킨다.



constructor 프로퍼티를 사용하는 예

							// 간단한 새 User 객체를 정의한다.
							function User () { }

							// 새 User 객체를 만든다.
							var me = new User();

							// 역시나 새 User 객체를 만든다.
							// (첫 번째 User 객체의 constructor를 참조한다.)
							var you = new me.constructor();

							alert(me.constructor);

							// 실제로 constructor가 같음을 알 수 있다.
							alert(me.constructor == you.constructor);
						

이제 간단한 객체를 생성하는 방법을 알았으니, 객체를 그토록 유용하게 만드는 콘텍스트 메서드와 프로퍼티를 추가할 차례이다.