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

둡둡·2024년 1월 12일

Modern Javascript Deep Dive

목록 보기
17/49

16.1. 내부 슬롯과 내부 메서드

  • 내부 슬롯과 내부 메서드는 자바스크립트 엔진의 구현 알고리즘을 설명하기 위한 의사 프로퍼티(pseudo property)와 의사 메서드(pseudo method)
    • 의사 코드 / 메서드 : 프로그램 진행 과정을 인간의 언어로 간략히 설명해놓은 코드나 메서드
  • 일반적으로 직접 접근할 수 있도록 공개된 객체의 프로퍼티는 아님
    • 일부 내부 슬롯의 경우 __proto__ 를 통해 간접적으로 접근 가능

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

  • 자바스크립트 엔진은 프로퍼티를 생성할 때 상태를 나타내는 프로퍼티 어트리뷰트를 기본 값으로 자동 정의함
    • 프로퍼티 상태(=어트리뷰트): 값(value), 갱신 가능 여부(writable), 열거 가능 여부(enumerable), 재정의 가능 여부(configurable)
  • 프로퍼티 상태에 직접 접근할 수는 없지만, Object.getownPropertyDescriptor 메서드가 반환하는 프로퍼티 디스크립터(PropertyDescriptor) 객체 참조 가능

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

16.3.1. 데이터 프로퍼티

  • 데이터 프로퍼티(data property): 키와 값으로 구성된 일반적인 프로퍼티
    • 현재까지 살펴본 모든 프로퍼티
  • 데이터 프로퍼티의 상태(어트리뷰트)
    • [[Value]] : 프로퍼티 값
    • [[Writable]] : 변경 가능 여부 (boolean)
    • [[Enumerable]] : 열거 가능 여부 (boolean)
    • [[Configurable]] : 재정의 가능 여부 (boolean)

16.3.2. 접근자 프로퍼티

  • 접근자 프로퍼티(accessor property)
    • 자체 값을 가지지 않고 다른 데이터 프로퍼티의 값을 읽거나 저장할때 호출되는 접근자 함수로 구성된 프로퍼티
    • getter/setter 함수라고도 함
  • 접근자 프로퍼티의 상태(어트리뷰트)
    • [[Get]] : getter, 프로퍼티 값 반환
    • [[Set]] : setter, 프로퍼티 값 저장
    • [[Enumerable]] : 데이터 프로퍼티와 같음
    • [[Configurable]] : 데이터 프로퍼티와 같음

16.4. 프로퍼티 정의

  • 새로운 프로퍼티를 추가하고, 어트리뷰트를 명시적으로 정의하는 것
  • 기존 프로퍼티의 어트리뷰트를 재정의하는 것
  • Object.defineProperty : 한 번에 하나의 프로퍼티 정의
  • Object.defineProperties : 여러 개의 프로퍼티 한 번에 정의

16.5. 객체 변경 방지

  • 객체는 재할당 없이 직접 변경할 수 있음
  • 객체의 변경을 방지하는 다양한 메서드
    • 객체 확장 금지: Object.preventExtensions
    • 객체 밀봉: Object.seal
    • 객체 동결: Object.freeze

16.5.1. 객체 확장 금지

  • 객체의 프로퍼티 추가 금지
  • Object.isExtensible : 확장 여부 확인

16.5.2. 객체 밀봉

  • 프로퍼티 추가 및 삭제, 재정의 금지
  • 읽기와 쓰기만 가능
  • Object.isSealed : 밀봉 여부 확인

16.5.3. 객체 동결

  • 프로퍼티 추가 및 삭제, 어트리뷰트 재정의, 값 갱신 금지
  • 읽기만 가능
  • Object.isFrozen : 동결 여부 확인

16.5.4. 불변 객체

  • 불변 객체는 객체의 중첩 객체까지 동결하는 것
  • 모든 프로퍼티에 대해 재귀적으로 Object.freeze 메서드 호출

[출처] 모던 자바스크립트, Deep Dive

profile
괴발개발라이프

0개의 댓글