본문 바로가기
JavaScript/모던 자바스크립트 Deep Dive 스터디

16장 프로퍼티 어트리뷰트

by 정ㅇr 2022. 10. 17.
728x90

* 해당 글은 모던 자바스크립트 Deep Dive를 공부하며 정리한 글입니다. *

 

내부 슬롯과 내부 메서드

- 자바스크립트 엔진의 구현 알고리즘을 설명하기 위해 사용하는 것

- ECMAScript 사양에 정의된 대로 구현되어 자바스크립트 엔진에서 실제로 동작하지만 개발자가 직접 접근할 수는 없음

- 단, 일부 내부 슬롯과 내부 메서드는 접근 가능함

// 모든 객체는 [[Prototype]] 이라는 내부 슬롯을 가짐

const a = {};
o.__proto__ // Object.prototype

 

자바스크립트 엔진은 프로퍼티를 생성할 때 프로퍼티의 상태를 나타내는 프로퍼티 어트리뷰트를 기본값으로 자동 정의한다.

 

프로퍼티의 상태는 프로퍼티의 값, 값의 갱신 가능 여부, 열거 가능 여부, 재정의 가능 여부를 말한다.

 

프로퍼티 어트리뷰트는 자바스크립트 엔진이 관리하는 내부 상태 값인 내부 슬롯 [[Value]], [[Writable]], [[Enumerable]], [[Configurable]]이다.

 

const person = {
  name: "JungAh",
};

// 프로퍼티 어트리뷰트 정보를 제공하는 프로퍼티 디스크립터 객체를 반환함
// Object.getOwnPropertyDescriptor라는 메서드를 사용한다. 
// 첫번째 매개변수는 객체의 참조, 두번째는 프로퍼티 키를 문자열로 입력한다.
console.log(Object.getOwnPropertyDescriptor(person, "name"));

참고로 ES8에 도입된 Object.getOwnPropertyDescriptors는 모든 프로퍼티에 대해서 값을 반환한다.

 

데이터 프로퍼티는 키와 값으로 구성된 일반적인 프로퍼티다. 지금까지 살펴본 모든 프로퍼티는 데이터 프로퍼티다.

접근자 프로퍼티는 자체적으로는 값을 갖지 않고 다른 데이터 프로퍼티의 값을 읽거나 저장할 때 호출되는 접근자 함수로 구성된 프로퍼티다.

 

 

프로토타입이란 어떤 객체에 상위(부모) 객체의 역할을 하는 객체를 말한다.

프로토타입 체인은 프로토타입이 단방향 링크드 리스트 형태로 연결되어 있는 상속구조를 말한다.

이와 관련되서는 책 19장에서 나온다.

 

프로퍼티 정의란 새로운 프로퍼티를 추가하면서 프로퍼티 어트리뷰트를 명시적으로 정의하거나, 기존 프로퍼티의 프로퍼티 어트리뷰트를 재정의하는 것을 말한다.

정의 시에 Object.defineProperty 메서드를 사용하면 된다. 참고로 이 메서드는 한번에 하나의 프로퍼티만 정의할 수 있고, 여러 개를 정의할 경우 Object.defineProperties 메서드를 사용해야 한다.

 

 

객체는 변경 가능한 값이므로 재할당 없이 직접 변경할 수 있다. 이를 방지하기 위해서 자바스크립트에서는 다양한 메서드를 제공한다.

 

객체가 확장 가능한지 아닌지는 Object.isExtensible 메서드로 확인 가능하다.

밀봉된 객체인지는 Object.isSealed, 동결된지는 여부는 Object.isFrozen 메서드로 확인 할 수 있다.

 

앞에서의 객체 변경 방지 메서드들은 얕은 변경 방지로 직속 프로퍼티만 변경이 방지되고 중첩 객체까지는 영향을 주지 못한다. 따라서 Object.freeze 메서드로 객체를 동결해도 중첩 객체까지 동결할 수는 없다. 중첩 객체의 모든 값을 Object.freeze로 동결해야 불변 객체를 구현할 수 있다.

반응형

'JavaScript > 모던 자바스크립트 Deep Dive 스터디' 카테고리의 다른 글

25장 클래스  (0) 2022.11.01
20장 strict mode  (0) 2022.10.26
13장 스코프  (0) 2022.10.12
11장 원시 값과 객체의 비교  (1) 2022.10.04
7장 연산자  (0) 2022.09.29

댓글