앞서서 설명한 바와 같이, 자바스크립트의 모든 객체는 Object 클래스를 상속한다.
Date()와 RegExp() 생성자에 의해 생성되는 객체들처럼 특수화된 객체들에 각각 고유한 프로퍼티와
메서드가 있으며 동시에, 모든 객체에는 공통으로 Object에서 상속받은 프로퍼티와 메서드가 있다.
이러한 프로퍼티와 메서드들은 모든 객체에서 보편적으로 나타나는 특성을 지니고 있으므로
특별히 주의 깊에 살펴보아야 한다.
1. constructor 프로퍼티
자바스크립트에서 모든 객체는 객체를 초기화하는데 사용되는 생성자 함수인 constructor 프로퍼티를
지니고 있다. 예를 들어 Date() 생성자를 사용하여 객체 d 를 생성하였다면, d.constructor 프로퍼티는
Date를 가리킨다.
d.constructor == Date; // 이 표현식은 참(true)으로 평가된다.
생성자 함수는 객체의 범주 즉 클래스를 정의하므로, constructor 프로퍼티는 객체의타입을 판단하는 데
사용될 수 있다. 예를 들어 정체를 알 수 없는 객체의 타입을 판단하기 위하여 다음과 같이 코드를 작성할 수 있다.
instanceof 연산자는 constructor 프로퍼티의 값을 사용한다. 따라서 위 코드는 다음과 같이 작성할 수 있다.
2. toString() 메서드
toString() 메서드는 별도의 전달인자 없이 호출되며, 메서드를 호출한 객체의 값을 어떠한 방식으로든
표현하는 문자열을 만들어 결과로 반환한다. 자바스크립트는 객체를 문자열로 변환해야 할 때 항상
이 메서드를 사용하는데, 예를 들면 문자열과 객체를 + 연산자를 사용하여 연결하려 할 때나, 문자열을
전달인자로 받는 alert!() 같은 메서드의 인자로 객체를 전달하려 할 때, 객체의 toString() 메서드를 호출하여 이러한 변환 작업을 수행한다.
기본으로 주어지는 toString() 메서드가 제공하는 정보는 그다지 유용하지 않다.
예를 들어다음과 같은 호출은 단순히 "[object Object]" 같은 문자열로 평가된다.
이와 같이 기본으로 주어지는 메서드가 그다지 유용한 정보를 제공하지 않다 보니, 많은 클래스가 자신들만의 고유한 toString() 메서드를 정의한다. 예를 들어 배열을 문자열로 변환하면 배열의 각 원소를 문자열로 변환하여 연결한 문자열을 얻을 수 있으며, 함수를 문자열로 변환하면 함수의 소스 코드를 얻을 수 있다.
9장에서는 직접 정의한 객체 타입에 대해 사용자 정의 toString() 메서드를 정의하는 방법을 알아본다.
3. toLocaleString()
ECMAScript v3과 자바스크립트 1.5의 Object 클래스에는 toString() 메서드 외에도 toLocaleString() 메서드가 정의되어 있다. 이 메서드의 목적은 객체의 지역화(localized)된 문자열 표현을 제공하기 위함이다.
Object 클래스에 의하여 기본으로 제공되는 toLocalString() 메서드는 그 자체로는 어떠한 지역화 작업도
행하지 않는다. 따라서 기본으로 제공되는 toLocaleString() 메서드가 반환하는 값은 toString()과 같다.
그러나 Object 클래스의 서브 클래스들은 자신들만의 고유한 toLocaleString() 메서드를 정의할 수 있다. ECMAScript v3에서 Array, Date, Number 클래스들은 지역화된 반환값을 정의하는 toLocaleString()
메서드를 정의하고 있다.
4. valueOf() 메서드
valueOf() 메서드는 toString() 메서드와 매우 유사하다. 이 메서드는 자바스크립트가 객체를 문자열이 아니라 숫자 같은 다른 기본 타입으로 변환하려 할 때 호출된다. 즉, 객체가 기본 타입 값을 필요로 하는 문맥 안에서 사용될 때, 자바스크립트는 valueOf() 메서드를 자동으로 호출한다.
Object 클래스가 기본으로 제공하는 valueOf() 메서드는 이러한 변환 작업을 행하지 않는다.
하지만 자바스크립트의 몇몇 내장 객체들은 자신만의 valueOf() 메서드를 정의하고 있다.
(Date.valueOf() 메서드를 참고하라).
9장에서는 직접 정의한 객체 타입에 대해 사용자 정의 valueOf() 메서드를 정의하는 방법을 알아본다.
5. hasOwnProperty() 메서드
hasOwnProperty() 메서드는 프로퍼티의 이름을 담는 한 개의 문자열 전달인자를 받아서 객체가 이 프로퍼티를 소유하고 있는지 검사한다. 프로퍼티가 상속받은 것이 아니고 객체 안에 지역적으로 정의되어 존재한다면 true를 반환하고 그렇지않으면 false를 반환한다. 예를 들면 다음과 같다.
o.hasOwnProperty("undef"); // false : 프로퍼티가 정의되지 않았다.
o.hasOwnProperty("toString"); // false : toString은 상속받은 프로퍼티다.
Math.hasOwnProperty("cos"); // true : Math 객체에 cos 프로퍼티가 있다.
프로퍼티의 상속은 9장에서 자세히 설명한다.
이 메서드는 ECMAScript v3에 정의되어 있으며 자바스크립트 1.5와 그 이후 버전에서 구현되어 있다.
6. propertyIsEnumerable() 메서드
propertyIsEnumerable() 메서드는 hasOwnProperty() 메서드와 마찬가지로 프로퍼티의 이름을 담은 문자열 전달인자를 하나 받아서, 이 이름의 프로퍼티를 객체가 상속받지 않고 직접 지역적으로 정의했는지 검사한다. 나아가 이 프로퍼티가 for/in 루프를 사용하여 열거될 수 있는 것인지 검사한다.
이 모든 조건을 충족하면 true를 반환하며, 그렇지 않으면 false를 반환한다. 예를 들면 다음과같다.
o.propertyIsEnumerable("x"); // true : 프로퍼티가 존재하고 열거할 수 있다.
o.propertyIsEnumerable("y"); // false : 프로퍼티가 존재하지 않는다.
o.propertyIsEnumerable("valueOf"); // false : valueOf는 상속받은 프로퍼티다.
이 메서드는 ECMAScript v3에 정의되어 있으며, 자바스크립트 1.5와 그 이후 버전에서 구현되어 있다.
객체의 모든 사용자 정의 프로퍼티가 열거할 수 있지는 않다. 상속받은 프로퍼티는 열거가 불가능하며
(9장의 프로퍼티 상속에 대한 절에서 자세히 설명한다), 따라서 이 메서드는 hasOwnProperty()와
항상 동일한 값을 반환한다.
7. isPrototypeOf() 메서드
isPrototypeOf() 메서드는, 이 메서드의 객체가 전달인자로 주어진 객체의 프로토타입 객체라면
true를 반환하고, 그렇지 않으면 false를반환한다. 예를 들면 다음과 같다.
Object.prototype.isPrototypeOf(o); // true: o.constructor == Object
Object.isPrototypeOf(o); // false
o.isPrototypeOf(Object.prototype); // false
Function.prototype.isPrototypeOf(Object) // true: Object.constructor == Function
프로토타입 메서드는 9장에서 자세히 설명한다.
'IT_Programming > JavaScript' 카테고리의 다른 글
자바스크립트 완벽가이드 - 7.6 배열 원소 읽고 쓰기 (0) | 2010.07.04 |
---|---|
자바스크립트 완벽가이드 - 7.5 배열 (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 7.3 연관 배열로서의 객체 (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 7.2 객체 프로퍼티 (0) | 2010.07.04 |
자바스크립트 완벽가이드 - 7.1 객체 생성하기 (0) | 2010.07.04 |