10.1 객체란?
- 자바스크립트는 객체 기반의 프로그래밍 언어, 자바스크립트를 구성하는 모든 것이 객체
- 원시 타입의 값은 변경 불가능한 값, 객체는 변경 가능한 값
- 객체는 0개 이상의 프로퍼티로 구성된 집합이며, 프로퍼티는 키(key)와 값(value)으로 구성됨.
- 자바스크립트에서 사용할 수 있는 모든 값은 프로퍼티 값이 될 수 있음.
- 객체는 객체의 상태를 나타내는 값(프로퍼티)과 프로퍼티를 참조하고 조작할 수 있는 동작(메서드)을 모두 포함
const counter = {
num: 0, // 프로퍼티: 객체의 상태를 나타내는 값(data)
increase: function() { // 메서드: 프로퍼티(상태 데이터)를 참조하고 조작할 수 있는 동작(behavior)
this.num++;
}
};
10.2 객체 리터럴에 의한 객체 생성
- 인스턴스란 클래스에 의해 생성되어 메모리에 저장된 실체를 말함.
- 자바스크립트는 프로토타입 기반 객체지향 언어로서 클래스 기반 객체지향 언어와는 달리 다양한 객체 생성 방법을 지원함.
- 객체 리터럴
- Object 생성자 함수
- 생성자 함수
- Object.create 메서드
- 클래스(ES6)
- 변수에 할당된 시점에 자바스크립트 엔진은 객체 리터럴을 해석해 객체를 생성함.
var person = {
name: 'Lee',
sayHello: function() {
console.log(`Hello! My name is ${this.name}. `);
}
};
console.log(typeof person); // object
console.log(person); // {name: 'Lee', sayHello: f}
- 만약 중괄호 내에 프로퍼티를 정의하지 않으면 빈 객체가 생성됨.
const empty = {};
console.log(typeof empty); object
- 객체 리터럴의 중괄호는 코드 블록을 의미하지 않음. 코드 블록의 닫는 중괄호 뒤에는 세미콜론을 붙이지 않음.
- 하지만 객체 리터럴은 값으로 평가되는 표현식이므로 닫는 중괄호 뒤에 세미콜론을 붙임.
10.3 프로퍼티
- 객체는 프로퍼티의 집합이며, 프로퍼티는 키와 값으로 구성됨.
- 프로퍼티를 나열할 때는 쉼표(,)로 구분한다. 마지막 프로퍼티 뒤에는 쉼표를 사용하지 않으나 사용해도 좋음.
프로퍼티 키: 빈 문자열을 포함하는 모든 문자열 또는 심벌 값
프로퍼티 값: 자바스크립트에서 사용할 수 있는 모든 값
- 프로퍼티 키는 프로퍼티 값에 접근할 수 있는 이름으로서 식별자 역할을 함
- 식별자 네이밍 규칙을 준수하는 프로퍼티 키와 그렇지 않은 프로퍼티 키는 미묘한 차이가 존재.
- 네이밍 규칙을 준수하면 따옴표 생략 가능
- 네이밍 규칙을 준수하지 않으면 따옴표 생략이 불가능
const person = {
firstName: 'Ung-mo', // 식별자 네이밍 규칙을 준수하는 프로퍼티 키
'last-name': 'Lee' // 식별자 네이밍 규칙을 준수하지 않는 프로퍼티 키
};
- 문자열 또는 문자열로 평가할 수 있는 표현식을 사용해 프로퍼티 키를 동적으로 생성할 수 있음.
- 이 경우에는 프로퍼티 키로 사용할 표현식을 대괄호([...])로 묶어야 함.
let obj = {};
const key = 'hello';
obj = {
[key]: 'world'
};
- 이미 존재하는 프로퍼티 키를 중복 선언하면 나중에 선언한 프로퍼티가 먼저 선언한 프로퍼티를 덮어씀.
const foo = {
name: 'Lee',
name: 'Kim'
};
console.log(foo['name']); 'kim'
10.5 프로퍼티 접근
- 프로퍼티에 접근하는 방법은 다음과 같이 두 가지입니다.
- 마침표 프로퍼티 접근 연산자(.)를 사용하는 마침표 표기법
- 대괄호 프로퍼티 접근 연산자([...])를 사용하는 대괄호 표기법
const person = {
name: 'Lee'
};
// 마침표 표기법에 의한 프로퍼티 접근
console.log(person.name);
// 대괄호 표기법에 의한 프로퍼티 접근
console.log(person['name']);
- 대괄호 표기법을 사용하는 경우 대괄호 프로퍼티 접근 연산자 내부에 지정하는 프로퍼티 키는 반드시 따옴표로 감싼 문자열이어야 함.
- 접근 연산자 내에 따옴표로 감싸지 않은 이름을 프로퍼티 키로 사용하면 자바스크립트 엔진은 식별자로 해석함.
10.6 프로퍼티 값 갱신
- 이미 존재하는 프로퍼티 값을 할당하면 프로퍼티 값이 갱신됨.
const person = {
name: 'Lee'
};
person.name = 'Kim';
console.log(person); { name: 'Kim' }
10.7 프로퍼티 동적 생성
- 존재하지 않는 프로퍼티에 값을 할당하면 프로퍼티가 동적으로 생성되어 추가되고 프로퍼티 값이 할당됨.
const person = {
name: 'Lee'
};
person.age = 20;
console.log(person); {name, age}
10.8 프로퍼티 삭제
- delete 연산자는 객체의 프로퍼티를 삭제함.
- 이 때 delete 연산자의 피연산자는 프로퍼티 값에 접근할 수 있는 표현식이어야 함.
const person = {
name: 'Lee'
};
person.age = 20;
delete person.name;
delete person.age;
delete person.address;
console.log(person);
10.9 ES6에서 추가된 객체 리터럴의 확장 기능
- 프로퍼티 축약 표현
- 객체 리터럴의 프로퍼티는 프로퍼티 키와 프로퍼티 값으로 구성됨.
const x = 1, y = 2;
const obj = {
x: x,
y: y
};
console.log(obj);
'자바스크립트 DeepDive' 카테고리의 다른 글
자바스크립트 DeepDive 11장 원시 값과 객체의 비교 (0) | 2022.10.10 |
---|---|
자바스크립트 DeepDive 9장 타입 변환과 단축 평가 (1) | 2022.10.08 |
자바스크립트 DeepDive 8장 제어문 (1) | 2022.10.06 |
자바스크립트 DeepDive 7장 연산자 (0) | 2022.10.01 |
자바스크립트 DeepDive 6장 데이터 타입 (1) | 2022.10.01 |