객체

자바스크립트의 가장 기본적인 데이터 타입

[이번 장에서 공부할 내용]

  • 객체 생성
  • 검색
  • 설정
  • 삭제
  • 테스트
  • 프로퍼티 열거


6.1 객체 소개

객체는 복합된 값이다.

- 객체는 여러가지 값(기본 값이나 다른 객체)을 모아서 이름을 통해 값을 저장하고 가져올 수 있게 한다.
- 객체는 프로퍼티의 순서 없는 집합이며 각 프로퍼티에는 이름과 값이 있다.
- 프로토타입으로 불리는 다른 객체에서 프로퍼티를 상속하기도 한다.


  • 객체
    - 문자열, 숫자, 심벌, true, false, null, undefined가 아닌 값
    - 가변이며 값이 아닌 참조로 조작한다.
  • 프로퍼티
    - 이름이 있다.
    - 프로퍼티 이름에는 빈 문자열과 심벌을 포함해 어떤 문자열이든 쓸 수 있다
    - 프로퍼티같은 이름을 가질 수 없다.
    - 상속되지 않은 프로퍼티를 가리켜 자체 프로퍼티(own property)라고 부른다.

🔔프로퍼티 속성

  1. 쓰기 가능(writable) - 프로퍼티에 값을 설정할 수 있는지 없는지를 나타낸다.
  2. 열거 가능(enumerable) - for/in 루프에 프로퍼티 이름을 반환할지 안 할지를 나타낸다.
  3. 변경 가능(configurable) - 프로퍼티를 삭제할 수 있는지 없는지, 속성을 바꿀 수 있는지 없는지를 나타낸다.


6.2 객체 생성

객체를 생성할 때는 객체 리터럴, new 키워드 또는 Object.create() 함수를 사용한다.

6.2.1 객체 리터럴

객체 리터럴

  • 가장 단순한 형태는 콜론으로 구분한 이름:값 쌍을 콤마로 구분해 중괄호로 감싼 형태
let empty = {};								// 프로퍼티가 없는 객체
let point = { x: 0, y: 0 };					// 숫자 프로퍼티 두 개
let p2 = { x: point.x, y: ponint.y+1}		// 좀 더 복잡한 값
let book = {
  "main title": "JavaScript",				// 이 프로퍼티 이름에는 스페이스와 하이폰
  "sub-title": "The Definitive Guide",		// 들어 있으므로 문자열 리터럴을 썼습니다.
  for: "all audiences",						// for는 예약어지만 따옴표를 쓰지 않았습니다.
  author: {									// 이 프로퍼티의 값은
    firstname: "David",						// 객체입니다.
    surname: "Flanagan"
  }
};
  • 마지막 프로퍼티 뒤에 콤마를 쓸 수 있다.
  • 리터럴을 평가할 때마다 새 객체가 만들어진다.
  • 프로퍼티의 값도 리터럴을 평가할 때마다 평가된다.
    -> 반복적으로 호출죄는 함수나 루프 바디 안에 있으면, 새 객체를 여러 개 만들 수 있다.

6.2.2 new

- new 연산자는 새 객체를 생성하고 초기화한다.
- new 키워드 뒤에는 반스기 함수 호출이 있어야 한다.
- 생성자라 부르고, 새로 생성된 객체를 초기화하는 목적으로 사용한다.

let 0 = new Object();	// 빈 객체를 만든다. {}와 같다.
let a = new Array();	// 빈 객체를 만든다. []와 같다.
let d = new Date();		// 현재 시간을 나타내는 Date 객체를 만든다.
let r = new Map();		// 키와 값을 연결하는 Map 객체를 만든다.

⭐6.2.3 프로토타입

- 자신과 연결된 두 번째 객체를 의미한다.
- 객체 리터럴을 사용해 생성한 객테는 모두 같은 프로토타입을 가진다.
- 프로토타입 객체는 Object.prototye이라는 코드로 참조할 수 있다.

객체상속
new ObjectObject.prototype
new Array()Arry.prototype
new Date()Date.prototype

6.2.4 Object.create()

- Object.create()는 첫 번째 인자를 프로토타입 삼아 새 객체를 생성한다.

let o1 = Object.create({x: 1, y: 2});	// o1은 x와 y 프로퍼티를 상속한다.
o1.x + o1.y								// => 3
  • 인자로 null을 전달하면, 기본 메서드가 없다.(+ 연산자와 함께 사용 불가능)
let o2 = Object.create(null);	// o2는 프로터치나 메서드를 상속하지 않는다.
  • 빈 객체를 만들고 싶으면 Object.prototype을 전달한다.
    -> 강력한 기능
let o3 = Object.create(Object.prototype);	// o3은 {}나 new Object()와 같다.

- Object.create()를 사용하는 목적 중 하나는 서드 파티 라이브러리에서 객체를 변경하는 사고를 막는 것이다.

  • 객체를 라이브러리 함수에 전달하지 않고 원래 객체를 상속하는 객체를 전달하면, 라이브러리에서 부주의하게 프로퍼티 값을 바꾸더라도 원래 객체에는 영향이 없다.
let o = { x: "don't change this value" };
library.function(Object.create(o));	// 의도치 않은 변경에 대한 방어


6.3 프로퍼티 검색과 설정

- 프로퍼티 값에 접근할 때는 점(.)이나 대괄호([]) 연산자를 사용한다.

  • 값이 객체인 표현식.(점)프로퍼티 이름(단순한 식별자)
  • 값이 객체인 표현식[프로퍼티 이름(문자열로 평가되는 표현식)]
let author = book.author;		// book의 author 프로퍼티를 가져온다.
let name = author.surname;		// author의 surname 프로퍼티를 가져온다.
let title = book["main title"];	// book의 main title 프로퍼티를 가져온다.

- 프로퍼티 생성 or 설정

book.edition = 7;					// book에 edition 프로퍼티를 만든다.
book["main title"] = "ECMAScript";	// main title 프로퍼티를 변경한다.

6.3.1 연관 배열인 객체



6.4 프로퍼티 삭제



6.5 프로퍼티 테스트



6.6 프로퍼티 열거



6.7 객체 확장



6.8 객체 직렬화



6.9 객체 메서드



6.10 확장된 객체 리터럴 문법

profile
프론트 공부 중입니다:)

0개의 댓글