Object (객체)
- 객체는 변형 가능한 속성들의 집합. 객체는 그저 속성을 모아놓은 것이다.
(숫자, 문자, 불리언, null, undefined 를 제외한 값들은 모두 객체다, 배열, 함수, 정규표현식 등은 모두 객체!) - 객체의 속성명은 문자열이면 모두 가능하다. 빈 문자열도 가능.
- 속성값은 undefined를 제외한 모든 값이 사용가능
- 자바스크립트 객체는 클래스가 없지만, 다른 객체에 상속하게 해주는 프로토타입(prototype) 이 있다.
이 특성을 잘 활용하면, 객체를 초기화하는 시간과 메모리 사용을 줄일 수 있다.
See the Pen object by juein (@juein) on CodePen.
객체 리터럴
- 중괄호
{}
로 둘러싸고 이름/값 쌍으로 표현하고, 속성:값 의 쌍들을 구분하는데에,
를 사용var car = { 'color' : 'black', 'model' : 'avante', 'year' : '2010', 'wheel' : 4 };
속성값 읽기
- 대괄호
[]
로 둘러싸거나, 마침표.
표기법으로 읽기 가능document.write( car['name'] ); document.write( car.name );
- (존재하지 않는 값을 읽으려고 하면 undefined 를 반환하는데,
||
연산자를 사용하여 undefined 외에 출력되는 기본값을 지정해 줄 수 있다document.write( car.window || "no window" );
속성값의 갱신
- 객체의 값은 할당에 의해 갱신된다. 이미 객체안에 존재하면 해당 속성의 값이 변경된다.
// 이미 존재하는 값에 값을 할당 : 속성 값 갱신
car['color'] = 'white';
// 새로운 속성 값 할당 : 객체의 속성 값 추가
car['make'] = 'hyndai';
참조
- 객체는 참조 방식으로 전달된다. 복사되는게 아니다.
var a = { number : 10 };
var b = a;
document.write(a.number); // 10 출력
document.write(b.number); // 10 출력
b.number = 20;
document.write(a.number); // 20 출력
document.write(b.number); // 20 출력
위 예제에서 변수 a는 객체 자체를 저장하고 있는 것이 아니라
생성된 객체를 가리키는 참조값으로 저장되어있으므로
같은값을 참조하는 b의 변수가 변경되면
a의 값도 같이 바뀐다.
프로토타입(Prototype)
- 자바스크립트의 모든 객체는 자신의 부모 역할을 하는 객체(Object)와 연결 되어있다.
- Object.prototype 에는 toString(), valueOf() 등과 같은 모든 객체에서 호출 가능한 기본 내장 메서드가 포함 되어있다.
이를 상속받은 객체에서 Object.prototype 에 있는 다양한 메서드를 마치 자신의 속성인것 처럼 사용 할 수 있다. - console.dir() 로 지정된 객체의 프로토타입을 쉽게 확인 가능
리플렉션
- 변수의 타입을 체크하고 객체의 구조를 탐색하는 과정을 리플렉션 이라 한다.
- 쉬운 방법으로 typeof 연산자를 사용하여 객체에 어떤 속성들이 있는지 확인 할 수 있다
document.write(typeof car.color); // string 출력
document.write(typeof car.wheel); // number 출력
- 원하지 않는 속성을 배제하기 위해 hasOwnProperty 메소드를 사용하는 방법이 있다.
(hasOwnProperty 메소드는 객체에 특정 속성이 있는지 확인해서 true/false 값을 반환해주는 메소드로,
이 메소드를 사용하면 프로토타입 체인을 바라보지 않는다.)
document.write(car.hasOwnProperty('color')); // true 출력
열거(Enumeration)
- for in 구문을 사용하여 객체에 있는 모든 값의 속성 이름을 늘어놓을 수 있다.
See the Pen car object by juein (@juein) on CodePen.
삭제
- delete 를 사용하여 객체의 속성을 삭제 가능하다.
(delete는 프로토타입 연결상에 있는 객체들은 접근하지 않는다.)
delete car.wheel;
최소한의 전역변수 사용
- 전역변수의 잦은사용은 프로그램의 유연성을 약화하기 때문에 가능하면 피하는것이 좋다.
전역변수 사용을 최소화 하는 방법중 하나로, 먼저 전역변수 하나를 생성 한 후
선언한 변수를 다른 전역변수를 위한 컨테이너로 사용하는 방법이 있다.
var car = {};
car.avante = {
'color' : 'black',
'make' : 'hyndai'
};
car.sorento = {
'color' : 'white',
'make' : 'kia'
};
- 이러한 방법으로 전역변수를 이름 하나로 관리하면
다른 라이브러리들과 연동할 때 발생하는 문제점을 최소화 할 수 있다. - 전역변수 사용을 줄이는데 효과적인 방법으로 클로저 사용이 있는데 그건 나중에..