Property Attribute에 대해 자세히 알아봅시다

boyeonJ·2023년 7월 3일
1

JavaScript Basic

목록 보기
15/24
post-thumbnail

Property Attribute

자바스크립트 엔진은 property생성할때 해당 property의 상태를 나타내는 property attribute를 default값으로 자동 정의합니다.

상태의 구성요소

여기서 property의 상태는 아래와 같은 구성요소가 있습니다.

  • 값(value)
  • 갱신 가능 여부(writable)
  • 열거 가능 여부(enumerable)
  • 재정의 가능 여부(configurable)

property attribute란?

property attribute는 내부슬롯입니다. 따라서 이 값들에는 직접 접근 할 수 없습니다.

  • [[Value]]
  • [[Writable]]
  • [[Eunumerable]]
  • [[Configuable]]

🔎 내부 슬롯이란?

내부 슬롯/내부 메서드는 자바스크립트 엔진의 구현 알고리즘을 설명하기 위해 ECMAScript 사양에서 사용하는 의사 프로퍼티/의사 메서드입니다.


내부 슬롯/내부 메서드는 정의된 대로 자바스크립트 엔진에서 실제로 동작하지만, 개발자직접 접근하거나 호출 할 수 있는 방법은 제공되지 않습니다.

하지만 일부 내부 슬롯/내부 메서드에 한해서 간접적으로 접근 할 수 있는 수단을 제공합니다. 객체의 [[Prototype]]이라는 내부 슬롯에 proto를 통해 간접적으로 접근가능한데 이가 대표적이 예 입니다.


Property Attribute에 접근할 수 있을까?🤔

위에서 언급했듯이 내부 슬롯에는 직접 접근 할 수 없습니다. 그런데 Property Attribute 내부슬롯에는 간접적으로 접근 할 수 있는 방법이 제공됩니다. 그 방법은 바로 Object.getOwnPropertyDescriptor입니다.

매개변수

  • 첫번째 매개변수: 객체 참조
  • 두번째 매개변수: 프로퍼티 키(문자열)

ES8부터 Object.getOwnPropertyDescriptors가 도입되었는데, 이는 두번째 파라미터 값을 넘기지 않고 호출되며, 해당 객체의 모든 프로퍼티의 Attributer정보를 제공합니다.

반환값

Property Descriptor 객체를 반환합니다.

만약 존재하지 않는 또는 상속받은 프로퍼티를 넘기면 undefined가 반환됩니다.

const person = {
	name: 'Lee';
    age = 20;
}

console.log(person.getOwnPropertyDescriptor(person));
/*
{
	name: {value: 'Lee', writable: true, enumerable: true, configurable: ture},
	age: {value: 20, writable: true, enumerable: true, configurable: ture},
}
*/

Property의 종류

Property는 데이터 Property, 접근자 Property 두가지의 종류가 있습니다.

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

Data Property

어트리뷰트 이름설명
[[Value]]프로퍼티에 저장된 실제 값(키를 통해 접근했을때 반환되는 값)
만약 property가 변경되면 [[Value]] 에 재할당이 이뤄진다.
[[Writable]]프로퍼티의 값이 변경 가능한지 여부를 나타냄. true면 변경 가능, false면 읽기 전용
[[Enumerable]]프로퍼티가 for...in 루프나 Object.keys() 등의 열거 가능한지 여부를 나타냄. true면 열거 가능, false면 열거 불가능
[[Configurable]]프로퍼티의 재정의 가능 여부를 나타냄, true면 변경 가능, false면 변경 불가능

🔍Configurable 는 프로퍼티의 재정의 가능 여부를 나타내는 값인데 여기서 프로퍼티의 재정의란 아래를 의미합니다.

1. 프로퍼티의 삭제
2. 프로퍼티 어트리뷰트 값의 변경

🚫 이때, 만약 Writable가 ture인 경우에는, Configurable가 false이더라도 Writable의 값을 ture로 변경가능할까요..?

Accessor Property

어트리뷰트 이름설명
[[GET]]만약 접근자 property key에 접근하면 getter가 호출되고 그 결과가 프로퍼티 값으로 반환된다.
[[SET]]만약 접근자 property key에 저장하면 setter가 호출되고 그 결과가 프로퍼티 값으로 반환된다.
[[Enumerable]]데이터 property와 같음
[[Configurable]]데이터 property와 같음

0개의 댓글