JS DeepDive 16장 프로퍼티 어트리뷰트

한칙촉·2024년 2월 29일

내부 슬롯과 내부 메서드

  • 내부 슬롯과 내부 메서드는 자바스크립트 엔진의 내부 로직이므로 원칙적으로 자바스크립트는 내부 슬롯과 내부 메서드에 직접적으로 접근하거나 호출할 수 있는 방법을 제공하지 않음
  • 모든 객체는 [[Prototype]]이라는 내부 슬롯을 가짐
    = [[Prototype]] 내부 슬롯의 경우, __proto__를 통해 간접적 접근 가능

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

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

  • 프로퍼티의 상태 = 프로퍼티의 값, 값의 갱신 가능 여부, 열거 가능 여부, 재정의 가능 여부
  • 프로퍼티의 어트리뷰트는 Object.getOwnPropertyDescriptor 메서드를 사용하여 간접적으로 확인 가능
const person = {
  name: 'Lee'
};

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

// 모든 프로퍼티의 프로퍼티 어트리뷰트 정보를 제공하는 
// 프로퍼티 디스크립터 객체들을 반환
console.log(Object.getOwnPropertyDescriptors(person));
/*
{
  age: {value: 20, writable: true, enumerable: true, configurable: true}
  name: {value: 'Lee', writable: true, enumerable: true, configurable: true}
}
*/

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

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

데이터 프로퍼티

프로퍼티 어트리뷰트는 자바스크립트 엔진이 프로퍼티를 생성할 때 기본값으로 자동 정의

프로퍼티
어트리뷰트
프로퍼티 디스크립터
객체의 프로퍼티
설명
[[Value]]value- 키를 통해 값에 접근하면 반환되는 값
- 키를 통해 프로퍼티 값을 변경하면 값을 재할당
[[Writable]]writable- 값의 변경 가능 여부를 나타내며 불리언 값을 가짐
- false인 경우 해당 프로퍼티의 값을 변경할 수 없는 읽기 전용이 됨
[[Enumerable]]enumerable- 프로퍼티의 열거 가능 여부를 나타내며 불리언 값을 가짐
- false인 경우 해당 프로퍼티는 for ...in 문이나 Object.keys 메서드 등으로
열거할 수 없음
[[Configurable]]configurable- 프로퍼티의 재정의 가능 여부를 나타내며 불리언 값을 가짐
- false인 경우 해당 프로퍼티의 삭제, 어트리뷰트 값의 변경이 금지됨
- [[Writable]]이 true인 경우 [[Value]]의 변경과 [[Writable]]을 false로
변경하는 것은 허용됨

접근자 프로퍼티

프로퍼티
어트리뷰트
프로퍼티 디스크립터
객체의 프로퍼티
설명
[[Get]]get- 접근자 프로퍼티를 통해 프로퍼티의 값을 읽을 때 호출되는 접근자 함수
- getter 함수가 호출되고 그 결과가 프로퍼티 값으로 반환됨
[[Set]]set- 접근자 프로퍼티를 통해 프로퍼티의 값을 저장할 때 호출되는 접근자 함수
- setter 함수가 호출되고 그 결과가 프로퍼티 값으로 반환됨
[[Enumerable]]enumerable데이터 프로퍼티와 같음
[[Configurable]]configurable데이터 프로퍼티와 같음

프로퍼티 정의

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

프로퍼티 디스크립터
객체의 프로퍼티
대응하는 프로퍼티 어트리뷰트생략했을 때의 기본값
value[[Value]]undefined
get[[Get]]undefined
set[[Set]]undefined
writable[[Writable]]false
enumerable[[Enumerable]]false
configurable[[Configurable]]false

객체 변경 방지

객체는 변경 가능한 값이므로 재할당 없이 직접 변경 가능
= 프로퍼티를 추가하거나 삭제할 수 있고, 프로퍼티 값 갱신 가능
= Object.defineProperty 또는 Object.defineProperties 메서드를 사용하여 프로퍼티 어트리뷰트 재정의 가능


구분메서드프로퍼티
추가
프로퍼티
삭제
프로퍼티
값 읽기
프로퍼티
값 쓰기
프로퍼티 어트리뷰트
재정의
객체 확장 금지Object.preventExtensions
(Object.isExtensible로 확인)
xoooo
객체 밀봉Object.seal
(Object.isSealed으로 확인)
xxoox
객체 동결Object.freeze
(Object.isFrozen으로 확인)
xxoxx
profile
빙글빙글돌아가는..

0개의 댓글