모던 자바스크립트 Deep Dive 16장 정리 - 프로퍼티 어트리뷰트

Hyodduru ·2022년 5월 25일
0
post-thumbnail

16장 프로퍼티 어트리뷰트

16.1 내부 슬롯과 내부 메서드

🧐 내부 슬롯(internal slot)과 내부 매서드(internal method)란?

자바스크립트 엔진의 구현 알고리즘을 설명하기 위해 ECMAScript 사양에서 사용하는 의사 프로퍼티(pseudo property)와 의사 메서드(pseudo method). ECMAScript 사양에서 등장하는 이중 대괄호([[...]])로 감싼 이름들. 자바스크립트 엔진에서 실제로 동작하지만 개발자가 직접 접근할 수 있도록 외부로 공개된 객체의 프로퍼티는 아님.

🔖 모든 객체는 [[proptotype]]이라는 내부 슬롯을 갖는다. 내부 슬롯은 자바스크립트 엔진의 내부 로직이므로 원칙적으로 접근할 수 없지만 __proto__ 를 통해 간접적으로 접근할 수 있음.

16.2 프로퍼티 어트리뷰트와 프로퍼티 디스크립터 객체

🧐 프로퍼티 어트리뷰트란?

프로퍼티를 생성할 때 프로퍼티의 상태를 나타냄

🧐 프로퍼티의 상태란?

프로퍼티의 값(value), 값의 갱신 가능 여부(writable), 열거 가능 여부(enumerable), 정의 가능 여부(configurable)

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

🧐 프로퍼티 디스크립터(PropertyDescriptor)란?

프로퍼티 어트리뷰트 정보를 제공

👉 Object.getOwnPropertyDescriptor 메서드는 프로퍼티 어트리뷰트 정보를 제공하는 프로퍼티 디스크립터 객체 반환

16.3 데이터 프로퍼티와 접근자 프로퍼티

🧐 데이터 프로퍼티란?

키와 값으로 구성된 일반적인 프로퍼티.
[[Value]] : 값의 반환
[[Writable]] : 값의 변경 가능 여부 (불리언 값)
[[Enumerable]] : 열거 가능 여부 (불리언 값)
[[Configurable]] : 재정의 가능여부 (불리언 값) - 해당 값이 false인 경우 해당 프로퍼티의 삭제, 프로퍼티 어트리뷰트 값의 변경이 금지된다.

🧐 접근자 프로퍼티란?

자체적으로는 값을 갖지 않고 다른 데이터의 프로퍼티의 값을 읽거나 저장할 때 사용하는 접근자 함수(accessor function)로 구성된 프로퍼티
[[Get]] : 값을 읽을 때
[[Set]] : 값을 저장할 때
[[Enumerable]] : 데이터 프로퍼티의 [[Enumerable]] 과 같다.
[[Configurable]] : 데이터 프로퍼티의 [[Configurable]] 과 같다.

접근자 함수를 getter/setter라고 부르기도 함.

🧐 프로토타입이란?

어떤 객체의 상위(부모) 객체의 역할을 하는 객체. 프로토타입은 하위 객체에게 자신의 프로퍼티와 메서드를 상속한다.

🧐 프로토타입 체인?

프로토타입이 단방향 링크드 리스트 형태로 연결되어 있는 상속 구조. 객체의 프로퍼티나 메서드에 접근하려고 할 때 해당 객체에 접근하려는 프로퍼티 또는 메서드가 없다면 프로토타입 체인을 따라 프로토타입의 프로퍼티나 메서드를 차례대로 검색한다.

16.4 프로퍼티 정의

🧐 프로퍼티 정의란?

새로운 프로퍼티를 추가하면서 프로퍼티 어트리뷰트를 명시적으로 정의하거나 기존 프로퍼티의 프로퍼티 어트리뷰트를 재정의하는 것.
Object.defineProperty, Object.defineProperties 메서드를 활용

16.5 객체 변경 방지

🧐 객체 변경을 방지하는 방법들

✔️ 객체 확장 금지 / Object.preventExtensions / 프로퍼티 추가가 금지된다.
Object.isExtensible 메서드로 확장이 가능한 객체인지 여부를 확인할 수 있다.
✔️ 객체 밀봉 / Object.seal / 읽기와 쓰기만 가능
Object.isSealed 메서드로 밀봉된 객체인지 여부 확인 가능
✔️ 객체 동결 / Object.freeze / 읽기만 가능
Object.isFrozen 메서드로 동결된 객체 여부 확인 가능

🔖 Object.freeze는 얕은 변경 방지. 중첩 객체까지 동결하기 위해서는 객체를 값으로 갖는 모든 프로퍼티에 대해 재귀적으로 Object.freeze 메서드를 호출해야 한다.

profile
꾸준히 성장하기🦋 https://hyodduru.tistory.com/ 로 블로그 옮겼습니다

0개의 댓글