본문 바로가기

JavaScript

[Deep dive] 10장 객체 리터럴

10.1 객체란?

 

 객체 타입 (object type)

 - 다양한 타입의 값(원시 값 또는 다른 객체)을 하나의 단위로 구성한 복합적인 자료구조 

 - 변경 가능한 값(mutable value)

 - 프로퍼티와 메서드로 구성된 집합체 

 

 프로퍼티

 - 키(key)와 값(value)로 구성 

 - 객체의 상태를 나타내는 값 (data)

 

 메서드 

 - 자바스크립트의 함수는 일급객체이므로 값으로 취급 가능

   -> 함수도 프로퍼티값으로 사용 가능

 - 프로퍼티를 참조하고 조작할 수 있는 동작(behavior)

 

var counter = {
    num = 0, //프로퍼티 
    increase : function () { //메서드
    	this.num ++; 
    }
};

 

10.2 객체 리터럴에 의한 객체 생성

 

 클래스 기반 객체지향 언어

 - java, c++

 - 클래스를 사전에 정의하고 필요한 시점에 new 연산자와 함께 생성자를 호출하여 인스턴스 생성하는 방식으로 객체 생성

 

 프로토타입 기반 객체지향 언어

 - javascript

 - 객체 생성 방법

 1) 객체 리터럴

 2) Object 생성자 함수 

 3) 생성자 함수 

 4) Object.create 메서드 

 5) 클래스 (ES6)

 

객체 리터럴로 생성

- 객체 리터럴은 중괄호({..})내에 0개 이상의 프로퍼티를 정의 

- 객체 리터럴에 프로퍼티를 포함시켜 객체를 생성함과 동시에 프로퍼티 생성 가능

- 객체를 생성한 이후에 프로퍼티를 동적으로 추가 가능

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}

- 중괄호 내에 프로퍼티를 정의하지 않으면 빈 객체 생성

var empty = {}; //빈 객체 
console.log(typeof empty); //object

 

10.3 프로퍼티 

 

- 객체는 프로퍼티의 집합이며 프로퍼티는 키와 값으로 구성

var person = {
  //프로퍼티 키는 name, 프로퍼티 값은 'Lee'
  name : 'Lee';
  //프로퍼티 키는 age, 프로퍼티 값은 20
  age : 20
};

프로퍼티 값

 - 자바스크립테엇 사용할 수 있는 모든 값 사용 가능

 

프로퍼티 키

 - 프로퍼티 값에 접근할 수 있는 이름으로서 식별자의 역할

 - 빈 문자열을 포함하는 모든 문자열 또는 심벌값

 - 식별자 네이밍 규칙을 따르지 않는 이름에는 반드시 따옴표를 사용해야 함

var person = {
  firstName : 'Ung-mo', //식별자 네이밍 규칙을 준수하는 프로퍼티 키
  'last-name':'Lee' //식별자 네이밍 규칙을 준수하지 않는 프로퍼티 키 
};

console.log(person); //{firstName : "Ung-mo", last-name: "Lee"}

 

- 문자열 또는 문자열로 평가할 수 있는 표현식을 사용해 프로퍼티 키를 동적으로 생성

 - 프로퍼티 키로 사용할 표현식을 대괄호([..])로 묶어야 함

var obj = {};
var key = 'hello';

//ES5 : 프로퍼티 키 동적 생성
obj[key] = 'world';
//ES6 : 계산된 프로퍼티 이름
//var obj = {[key] : 'world'};

console.log(obj); //{hello: "world"}

 

- 프로퍼티 키에 문자열이나 심벌 값 외의 값을 사용하면 암묵적 타입 변환을 통해 문자열이 됨

var foo = {
    0:1,
    1:2,
    2:3
};

console.log(foo); //{0:1, 1:2, 2:3}

 

- 이미 존재하는 프로퍼티 키를 중복 선언하면 나중에 선언한 프로퍼티가 먼저 선언한 프로퍼티를 덮어 씀

var foo = {
  name :'Lee',
  name : 'Kim'
};

console.log(foo); //{name : "Kim"}

 

10.4 메서드 

 

- 프로퍼티 값이 함수일 경우 일반 함수와 구분하기 위해 메서드(method)라 부름

- 객체에 묶여 있는 함수 

var circle = {
  radius : 5, //프로퍼티 

  //원의 지름
  getDiameter : function() { //메서드 
    return 2 * this.radius; //this는 circle을 가리킴
  }
};

console.log(circle.getDiameter()); //10

 

10.5 프로퍼티 접근 

 

1) 마침표 표기법 (dot notation)

  - 마침표 프로퍼티 접근 연산자(.) 사용

 

 2) 대괄호 표기법(bracket notation)

  - 대괄호 프로퍼티 접근 연산자 ([..]) 사용

  - 내부에 저장하는 프로퍼티 키는 반드시 따옴표로 감싼 문자열이어야 함

  - 자바스크립트에서 사용 가능한 유효한 이름이 아니면 반드시 대괄호 표기법을 사용해야 함

var person = {
	name : 'Lee'
};

//마침표 표기법에 의한 프로퍼티 접근
console.log(person.name); //Lee

//대괄호 표기법에 의한 프로퍼티 접근
console.log(person['name']); //Lee

 

- 객체에 존재하지 않는 프로퍼티에 접근하면 undefined 반환

var Person = {
	name : 'Lee'
};

console.log(person.age); //undefined

 

10.6 프로퍼티 값 갱신

 

- 이미 존재하는 프로퍼티에 값을 할당하면 프로퍼티 값이 갱신됨

var person = {
  name : 'Lee'
};

//person 객체에 name 프로퍼티가 존재하므로 name 프로퍼티의 값이 갱신됨
person.name = 'Kim';

console.log(person); // {name: "Kim"}

 

10.7 프로퍼티 동적 생성

 

- 존재하지 않는 프로퍼티에 값을 할당하면 프로퍼티가 동적으로 생성되어 추가되고 프로퍼티 값이 할당됨

var person = {
  name : 'Lee'
};

//person 객체에는 age 프로퍼티가 존재하지 않음
//따라서 person 객체에 age 프로퍼티가 동적으로 생성되고 값이 할당됨
person.age = 20;

console.log(person); // {name: "Lee", age:20}

 

10.8 프로퍼티 삭제 

 

- delete 연산자는 객체의 프로퍼티를 삭제 

var person = {
  name : 'Lee'
};

//프로퍼티 동적 생성
person.age = 20;

//person 객체에 age 프로퍼티가 존재함
//따라서 delete 연산자로 age 프로퍼티를 삭제 가능
delete person.age;

//person 객체에 address 프로퍼티가 존재하지 않음
//따라서 delete 연산자로 address 프로퍼티 삭제 불가 (에러가 발생하지는 않음)
delete person.address;

console.log(person); // {name:"Lee"}

 

10.9 ES6에서 추가된 객체 리터럴의 확장 기능 

 

10.9.1 프로퍼티 축약 표현 

 

- 프로퍼티 값으로 변수를 사용하는 경우 변수 이름과 프로퍼티 키가 동일한 이름일 때 프로퍼티 키 생략(property shorthand)가능

//ES5
var x =1, y=2;

var obj = {
  x:x,
  y:y
};

console.log(obj);

//ES6
let x =1, y=2;

//프로퍼티 축약 표현
const obj = {x,y};

console.log(obj);

 

10.9.2 계산된 프로퍼티 이름

 

계산된 프로퍼티 이름 (computed property name)

 - 문자열 또는 문자열로 타입변환할 수 있는 값으로 평가되는 표현식을 사용해 프로퍼티 키를 동적으로 생성

 

- ES5에서 계산된 프로퍼티 이름을 프로퍼티 키를 동적 생성하려면 객체 리터럴 외부에서 대괄호 표기법을 사용해야함

 

- ES6에서는 객체 리터럴 내부에서도 계산된 프로퍼티 이름으로 프로퍼티 키 동적 생성 가능

//ES6
const prefix = 'prop';
let i = 0;

//객체 리터럴 내부에서 계산된 프로퍼티 이름으로 키를 동적 생성
const obj = {
  ['${prefix}-${++i}']: i,
  ['${prefix}-${++i}']: i,
  ['${prefix}-${++i}']: i
};

console.log(obj); //{prop-1 :1, prop-2:2, prop-3:3}

 

10.9.3 메서드 축약 표현

 

- ES5에서 메서드를 정의하려면 프로퍼티 값으로 함수 할당

 

- ES6에서는 메서드를 정의할 때 function 키워드를 생략한 축약 표현 사용 가능 

//ES6
const obj = {
  name:'Lee',
  //메서드 축약 표현
  sayHi() {
    console.log('Hi!' + this.name);
  }
};

obj.sayHi(); //Hi! Lee

'JavaScript' 카테고리의 다른 글

[Deep dive] 12장 함수(1)  (0) 2023.08.08
[Deep dive] 11장 원시 값과 객체의 비교  (0) 2023.08.08
[Deep dive] 9장 타입 변환과 단축 평가  (0) 2023.08.07
[Deep dive] 8장 제어문  (0) 2023.08.07
[Deep dive] 7장 연산자  (0) 2023.08.07