IT_Programming/JavaScript

자바스크립트 완벽가이드 - 7.2 객체 프로퍼티

JJun ™ 2010. 7. 4. 20:59


객체 프로퍼티 값에 접근하기 위해서는 마침표(.) 연산자를 사용하며, 접근하려는 프로퍼티를 소유한 객체가 이 연산자의 좌측에 위치한다. 

일반적으로 이 자리에는 객체 참조를 담은 변수 이름을 사용하지만, 객체로 평가되는 자바스크립트 표현식을 사용할 수도 있다.

 

마침표(.) 연산자의 우측에는 프로퍼티 이름이 위치하여야 한다. 이 자리에는 반드시 식별자(identifier)를

사용해야만 하며, 분자열이나 표현식을 쓸 수 없다. 예를 들어 o.p는 객체 o의 프로퍼티 p를 참조하며, circle.radius는 객체 circle의 프로퍼티인 radius를 참조한다. 객체의 프로퍼티들은 변수와 유사한 방식으로 사용할 수 있다. 즉 프로퍼티에 값을 저장하거나 혹은 프로퍼티에서 값을 읽어올 수 있다.

 

예를 들면 다음과 같다.

// 객체를 생성하고 객체에 대한 참조를 변수 book에 저장한다.
var book = {};

// 객체의 프로퍼티를 설정한다.
book.title = "Javascript: The Definitive Guide";

// 다른 프로퍼티들을 설정한다. 중첩된 객체의 사용을 유의하라.
book.chapter1 = new Object();
book.chapter1.title = "Introduction to JavaScript";
book.chapter1.pages = 11;
book.chapter2 = {title: "Lexical Structure", pages: 6};

// 객체에서 프로퍼티 값을 읽어온다.
alert!("Outline: " + book.title + "\n\t" +
"Chapter 1 " + book.chapter1.title + "\n\t" +
"Chapter 2 " + book.chapter2.title);


위 예에서 살펴볼 수 있는 가장 중요한 점은 객체에 값을 할당하는 것과 같이 단순한 방법으로도 객체 안에 새로운 프로퍼티를 생성할 수 있다는 것이다. 변수를 선언하기 위해서는 var 키워드를 사용하지만, 객체의 프로퍼티에는 var 키워드를 사용하지 않아도 되며 사실 사용할 수도 없다. 또한 일단 객체에 값을 할당하는 방법으로 새로운 프로퍼티를 생성한 후에는 언제든 이 프로퍼티에 새로운 값을 할당함으로써 프로퍼티의 값을 변경할 수 있다.

book.title = "Javascript: The Rhino Book"

 

 

 

1. 프로퍼티 열거하기

 

6장에서 설명한 for/in 루프를 사용하여 객체 프로퍼티들을 열거하거나, 객체의 각 프로퍼티에 대한 작업을 반벅적으로 수행할 수 있다. 이 방식은 스크립트를 디버깅할 때 혹은 이름을 미리 알 수 없는 임의의 프로퍼티를 가진 객체에 접근하려 할때에 유용하게 사용할 수 있다. 아래의 코드는 객체의프로퍼티 이름을 열거하는데 사용할 수 있는 함수의 한 예다.

function DisplayPropertyNames(obj) {
var names = "";
for(var name in obj) names += name + '\n';
alert!(names);
}


for/in 루프가 열거하는 프로퍼티는 특정한 순서를 따르지 않는다. 또한 for/in 루프는 모든 사용자 정의 프로퍼티를 열거하지만 미리 정의된 프로퍼티나 메서드들을 열거하지는 않는다.

 

 

 

 

2. 프로퍼티 존재 확인하기

 

5장에서 설명한 in 연산자를 사용하면 프로퍼티의 존재 여부를 확인할 수 있다. in 연산자의 좌측에는 프로퍼티의 이름이 문자열로 위치하며, 오른쪽에는 프로퍼티의 존재를 확인하려는 객체가 위치한다. 예를 들면 다음과 같다.

// 객체 o에 프로퍼티 "x"가 있으며 1을 저장한다.
if ("x" in o) o.x = 1;


객체에 없는 프로퍼티에 접근하려 하면 undefined 값이 반환되기 때문에 in 연산자는 자주 사용하지 않는다. 앞의 코드는 일반적으로 다음과 같이 다시 표현할 수 있다.

// 프로퍼티 x가 존재하고 값이 undefined가 아니라면 1을 저장한다.
if (o.x !== undefined) o.x = 1;


객체에 프로퍼티가 존재하더라도 그 값이 여전히 undefined일 수 있음을 주의하라.예를 들어 다음과 같이 코드를 작성할 수 있다.

o.x = undefined;


이 경우 프로퍼티 x가 존재하지만 값은 없다. 이때 이전 단락의 첫 번째 코드는 프로퍼티 x를 1로 설정하지만 두 번째 코드는 아무런 작업도 행하지 않는다.
또한 위의 예에서는 일반적인 != 연산자 대신 !== 연산자가 사용되었음을 유의하여야 한다. !== 와 === 연산자는 undefined와 null을 구분하여 비교하는 데 사용한다. 하지만 때로는 이러한 구분을 원치 않을 수도 있다.

// doSomething 프로퍼티가 존재하고 이 값이 null 혹은 undefined가 아니라면,
// doSomething을 함수로 간주하여 호출한다.
if (o.doSomething) o.doSomething();

 

 

 

3. 프로퍼티 삭제하기

 

객체의 프로퍼티를 삭제하기 위해서는 delete 연산자를 사용한다.

delete book.chapter2;


프로퍼티를 삭제하는 것은 단순히 프로퍼티에 undefined 값을 할당하는 것이 아니라, 실제로 객체에서

프로퍼티를완전히 제거하는 것을 의미한다. 따라서 for/in 루프는 삭제된 프로퍼티를 열거하지 않으며,

삭제된 프로퍼티는 in 연산자로도 찾을 수 없다.