10장 객체 리터럴
객체란
원시 값을 제외하면 모두 객체.
원시 값 | 객체 |
---|---|
변경 불가능(immutable) | 변경 가능(mutable) |
// 객체 리터럴에 의한 인스턴스 생성
var person = {
name: "foo",
sayHello: function(){ // ES5
console.log(`Hello. I'm ${this.name}`);
}
}; // 세미콜론 붙임. 코드블럭과의 차이
객체는 0개 이상의 프로퍼티로 구성된 집합
프로퍼티 = 키 : 값(딕셔너리)
값은 함수가 될 수도 있고 함수인 경우 메소드라도 부름.
결국 객체는 프로퍼티와 메소드로 구성된 집합체
- 프로퍼티는 “상태”를 나타내는 데이터 ex) name
- 메소드는 ‘‘동작” ex) sayHello
- 메서드 : 객체의 프로퍼티 값이 함수(일반함수와 구분하기 위해) => 객체에 묶여 있는 함수
=> 상태와 동작을 하나의 단위로 구조화할 수 있어 유용
인스턴스 생성
c++, java : 클래스 기반 객체지향 언어 => constructor로 인스턴스 생성
javascript : 프로토타입 기반 객체지향 언어
=> 객체 리터럴로 생성(생성자 함수 등을 통해 생성할수도 있지만 객체 리터럴이 가장 일반적이고 간단)
프로퍼티 키 규칙
식별자 네이밍 규칙을 따르는 프로퍼티 키를 사용하자
var person = {
firstName : 'World', // 적합
'last-name' : 'Hello', // 가능하지만 따옴표를 붙여야한다 - 권장 x
0 : 'zero' // 프로퍼티 키로 숫자를 사용가능하지만 내부적으로 문자열로 자동 변환됨
};
person[0]; // zero
person['0']; // zero
프로퍼티 CRUD
var person = {
name: 'Lee'
};
console.log(person.name); // Lee (가능)
console.log(person['name']); // Lee (가능. 따옴표 필요)
console.log(person.age); // undefined(ReferenceError가 발생하지 않으니 주의)
console.log(person[name]); // ReferenceError
person.age = 20;
// age 프로퍼티가 없으면 20으로 생성
// age 프로퍼티가 있으면 20으로 업데이트
delete person.age;
// age 프로퍼티가 없으면 무시(에러 발생 x)
// age 프로퍼티가 있으면 삭제
ES6 객체 리터럴 확장 기능
1. 프로퍼티 축약 표현
// ES5
var x = 1, y = 2;
var obj = {
x: x;
y: y;
};
// ES6
let x = 1, y = 2;
const obj = {x, y}; // 키 이름은 변수 이름으로 자동 생성
2. 객체 리터럴 내부 동적 프로퍼티 계산
// ES5 - 객체 리터럴 "외부"에서 프로퍼티 키 동적 생성해야함
var prefix = 'pre';
var i = 0;
var obj = {};
obj[prefix + '-' + ++i] = i;
obj[prefix + '-' + ++i] = i;
// ES6 - 객체 리터럴 "내부"에서도 프로퍼티 키 동적 생성 가능
const prefix = 'pre';
let i = 0;
const obj = {
[`$[prefix}-${++i}`] : i,
[`$[prefix}-${++i}`] : i
};
3. 메서드 축약 표현
// ES5
var obj = {
sayHi: function(){
console.log("Hi");
}
};
// ES6
var obj = {
sayHi(){
console.log("Hi");
}
};
단, 둘의 동작 방식은 서로 다르다. 26.2절에서 후술
심화
var person = {
'last-name' : 'Lee'
};
console.log(person.last-name); // (1)
(1)의 결과가 브라우저 환경과 Node.js 환경에서 다르다.
- 브라우저 환경 : NaN
- person.last와 name의 - 연산으로 생각
- person.last : undefined
- name : 브라우저 환경의 전역 객체 window의 프로퍼티 중 하나, 디폴트 값은 ‘‘(빈 문자열)
- 따라서 undefined - ‘’ = NaN
- Node.js : ReferenceError
- 브라우저 환경과 달리 name 식별자 존재하지 않음
- 따라서 ReferenceError
Reference
본 포스트는 이웅모, 모던자바스크립트 Deep Dive의 10장 내용을 요약 및 재구성한 것입니다.
Leave a comment