객체 리터럴


자바스크립트에서 객체 라고 하면 단순히 이름-쌍 해시 테이블을 생각하면 된다. 다른 언어에서 연관배열이라 불리는것과 유사하다.
빈 객체를 정의해놓고 기능을 추가해 나갈 수도 있다. 객체 리터럴 표기법은 이처럼 필요에 따라 객체를 생성할 때 이상적이다.

다음 예제를 보자.
// 빈 객체에서 시작한다.
var dog = {};

// 프로퍼티 하나를 추가한다.
dog.name = "Benji";

// 이번에는 메서드를 추가한다.
dog.getName = function(){
return dog.name;
}

console.log(dog.getName());

  • 프로퍼티와 메서드 값을 변경할 수 있다.
dog.getName = function(){
// 메서드가 하드코딩된 값을 반환하도록 재정의한다.
return "Fido";
}

  • 프로퍼티나 메서드를 완전히 삭제한다.
delete dog.name;

  • 다른 프로퍼티나 메서드를 추가한다.
dog.say = function(){
return "Woof!";
}

dog.fleas = true;



반드시 빈 객체에서 시작해야 하는 것은 아니다. 객체 리터럴 표기법을 쓰면 다음 예제처럼 생성 시점에 객체에 기능을 추가할 수 있다.

var dog = {
name : "Benjo",
getName : function(){
return this.name;
}
};




객체 리터럴 문법

  • 객체를 중괄호( { 와 } )로 감싼다.
  • 객체 내의 프로퍼티와 메서드를 쉼표(,)로 분리한다. 마지막 이름-값 쌍 뒤에 쉼표가 들어가면 IE에서는 에러가 발생하므로, 마지막에는 사용하지 말아야 한다.
  • 프로퍼티명과 프로퍼티 값은 콜론으로 분리한다.
  • 객체를 변수에 할당할 때는 닫는 중괄호 뒤에 세미콜론을 빼먹지 말아야 한다.



생성자 함수로 객체 생성하기


자바스크립트에도 자바와 같은 클래스 기반 객체 생성과 비슷한 문법을 가지는 생성자 함수가 존재한다.
객체를 생성할 때는 직접 만든 생성자 함수를 사용할 수도 있고, Object(), Date(), String() 등 내장 생성자를 사용할 수도 있다.

다음 예제는 동일한 객체를 생성하는 두가지 방법을 보여준다.
// 첫 번째 방법 - 리터럴 사용
var car = {goes : "far"}

// 다른 방법 - 내장 생성자 사용
// 경고 : 이 방법은 안티패턴이다.
var car = new Object();
car.goes = "far";


암묵적 타입캐스팅 피하기


자바스크립트는 변수를 비교할 때 암묵적으로 타입캐스팅을 실행한다. 때문에 false == 0 이나 "" == 0과 같은 비교가 true를 반환한다.

암묵적 타입캐스팅으로 인한 혼동을 막기 위해서는 항상 표현식과 값과 타입을 모두 확인하는 ===와 !== 연산자를 사용해야 한다.

var zero = 0;
if(zero === false){
// zero는 0이고 false가 아니기 때문에 이 블록은 실행되지 않는다.
console.log("oen : " + zero);
}

// 안티패턴
if(zero == false){
// 이 블록은 실행된다.
console.log("two : " + zero);
}


switch 패턴

다음 패턴을 따르면 switch문의 가독성과 견고성을 향상시킬 수 있다.

var inspect_me = 0,
result = '';

switch(inspect_me){
case 0:
result = "zero";
break;
case 1:
result = "oen";
break;
default:
result = "unknown";
}

console.log(result);


위의 간단한 예제에서 지켜진 규칙은 다음과 같다.

  • 각 case문을 switch문에 맞추어 정렬한다.(일반적인 중괄호 내 들여쓰기 규칙에서 벗어나는 방식이다)
  • 각 case문 안에서 코드를 들여쓰기 한다.
  • 각 case문은 명확하게 break;로 종료한다.
  • break문을 생략하여 통과(fail-through) 시키지 않는다. 그런 방법이 최선책이라는 확신이 있다면 해당 case에 반드시 기록을 남긴다.
  • 상응하는 case문이 하나도 없을때도 정상적인 결과가 나올 수 있도록 switch문 마지막에는 default:문을 쓴다.


+ Recent posts