본문 바로가기
개인 학습/모던 자바스크립트 Deep Dive

모던 자바스크립트 Deep Dive 16장

by qjatjs123123 2025. 2. 24.

프로퍼티 어트리뷰트


내부 슬롯과 내부 메서드

  • 내부 슬롯과 내부 메서드는 자바스크립트 엔진의 구현 알고리즘을 설명하기 위해 사용되는 의사 프로퍼티와 의사 메서드이다.
  • 개발자가 원칙적으로 접근하거나 호출하는 방법을 제공하지 않는다.
  • 하지만 객체는 Prototype이라는 내부 슬롯을 갖는다. 이 내부 슬롯은 __proto__ 을 통해 간접적으로 접근할 수 있다.

 

 

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

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

 

  • 프로퍼티 어트리뷰트는 value, writable, enumerable, configurable이 있다.
  • 이 어트리뷰트에 직접 접근할 수 없어 Object.getOwnPropertyDescriptor 메서드를 사용해야 한다.

 

 

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

프로퍼티는 데이터 프로퍼티접근자 프로퍼티로 구분할 수 있다.

 

데이터 프로퍼티

  • value  →   프로퍼티 키를 통해 프로퍼티 값에 접근하면 반환되는 값
  • writable  →   프로퍼티 값의 변경 가능 여부
  • enumerable  →  열거 가능 여부 (for ... in,   Object.keys) 쓸 수 있는지 여부
  • configurable  →  프로퍼티 재정의 가능 여부,  false 이면 프로퍼티 삭제, 값 변경 안됨

 

접근자 프로퍼티

접근자 프로퍼티는 데이터 프로퍼티의 값을 읽거나 저장할 떄 사용되는 접근자 함수

  • get  →  접근자 프로퍼티를 통해 데이터 프로퍼티 값을 읽을 때
  • set  →  접근자 프로퍼티를 통해 데이터 프로퍼티 저장할 때

 

 

프로퍼티 정의

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

 

const person = {};

Object.defineProperty(person, "firstName", {
  value: "Ungmo",
  writable: true,
  enumerable: true,
  configurable: true,
});

Object.defineProperty(person, "lastName", {
  value: "Lee",
  // 디스크럽터 객체의 프로퍼티를 누락 시키면 undefined, false가 기본값이다.
});

console.log(Object.getOwnPropertyDescriptors(person));

console.log(Object.keys(person));
//  [ 'firstName' ] 
//  enumerable 열거 옵션 false   

person.lastName = "Kim"
//  에러는 안나지만 바뀌지 않는다. writable 값 변경 가능 옵션 false

delete person.lastName;
//  에러는 안나지만 삭제되지 않는다. configurable 프로퍼티 재정의 가능 옵션 false

 

person라는 객체에 firstName,  lastName 프로퍼티를 추가하면서 프로퍼티 어트리뷰트를 정의하고 있다.

여기서 lastName처럼 value이외에 나머지를 생략하면 기본값이 적용된다.

 

Object.definedProperties 하면 여러 개의 프로퍼티를 한 번에 정의할 수 있다.

 

 

 

 

객체 변경 방지