본문 바로가기

자바스크립트 DeepDive

자바스크립트 DeepDive 10장 객체리터럴

반응형

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);
반응형