본문 바로가기

JavaScript/JavaScript기초

[Javascript] 프로퍼티 플래그와 설명자

프로퍼티 플래그

객체의 프로퍼티는 값과 함께 플래그(flag)라고 하는 특별한 속성을 3가지 가지고 있음

 

3가지 플래그

  • writable : 이 속성이 true이면 값을 수정할 수 있고, false이면 수정이 불가능함
  • enumerable : 이 속성이 true이면 반복문을 사용하여 나열할 수 있음
  • configurable : 이 속성이 true이면 해당 프로퍼티를 삭제하거나 플래그 수정이 가능함

일반적인 방식으로 객체 생성시 위 3가지 플래그의 기본값은 true로 설정되고 플래그를 수정할 수 있음

 

Object 의 getOwnPropertyDescriptor 메서드를 사용하면 해당 프로퍼티의 정보를 얻을 수 있음

 

getOwnPropertyDescriptor의 문법

let descriptor = Object.getOwnPropertyDescriptor(object,property)
  • object : 해당 프로퍼티가 있는 객체
  • property : 정보를 얻을 프로퍼티

위의 메서드로 생성한 것과 같은 프로퍼티의 정보를 descriptor 라고 하는데,Object메서드인 defineProperty 의 인자로 descriptor를 전해주어 프로퍼티를 생성할 수 있음

 

defineProperty의 문법

Object.defineProperty(object, propertyName, descriptor)

 

defineProperty와 getOwnPropertyDescriptor의 사용

let obj = {};

Object.defineProperty(obj,'name',{
	
    value:'park',
    writable:true
}); // defineProperty를 이용하여 프로퍼티 생성

//getOwnPropertyDescriptor를 이용하여 설명자 생성
let descriptor = Object.getOwnPropertyDescriptor(obj,'name');

console.log(descriptor);

 

일반적인 방법으로 프로퍼티를 생성했을때는 플래그들의 기본값이 true였지만, definePropery를 이용해서 프로퍼티를 생성했을 때 플래그를 설정해주지 않으면 기본값이 false인 것을 볼 수 있음

 

Object.defineProperties, Objec.getOwnPropertyDescriptors

defineProperties 메서드를 이용하면 여러개의 프로퍼티를 정의할 수 있고,

Objec.getOwnPropertyDescriptors 메서드를 이용하면 객체의 모든 프로퍼티의 설명자를 가져올 수 있음

let obj = {};

Object.defineProperties(obj,{
	name:{value:'park',writable:true},
    age:{value:25,enumerable:true}
});

//obj의 모든 프로퍼티 정보를 객체 형태로 가져옴
let desc = Object.getOwnPropertyDescriptors(obj);

for( let key in desc){
	
    console.log(desc[key]);
}

 

 

참조: https://ko.javascript.info/property-descriptors