티스토리 뷰

프로퍼티 플래그

객체 프로퍼티는 값(value)과 함께 플래그(flag)라 불리는 특별한 속성 세 가지를 가지고 있다.

No 속성 기준 값이 "true"인 경우 값이 "false"인 경우
1 writable 값(value) 수정 가능 읽기만 가능
2 enumerable 반복문을 사용해서 나열 가능 불가능
3 configurable 프로퍼티 삭제나 플래그 수정 가능 불가능

"평범한 방식"으로 프로퍼티를 만들면 프로퍼티의 플래그는 모두 "true"가 된다.


writable 플래그

"평벙한 방식"으로 값을 변경하지 못하게 할 때 writable의 값을 "false"로 한다.

 

[예제]

"평범한 방식"은 값을 변경하지 못한다.

let user = {
  name : 'mill'
};

Object.defineProperty(user, 'name', {
  writable : false
})

user.name = '밀';
user['name'] = '밀';

defineProperty를 사용해서 value을 값을 수정하거나,

writable 플래그를 "true"로 변경하지 않으면 객체의 값은 변경할 수 없다.

Object.defineProperty(user, 'name', {
    value : '밀'
})

//플래그 확인
Object.getOwnPropertyDescriptor(user, 'name')


enumerable 플래그

특정 프로퍼티의 enumerable 플래그 값을 false로 설정하면 "for...in"반복문에 나타나지 않게 할 수 있다.

 

[예제]

let user = {
  name : 'mill',
  toString(){
    return this.name;
  },
  like : {
    book : 'fantasy',
    music : 'jazz'
  }
};

for(let key in user){
  console.log(key);
}

Object.defineProperty(user, 'toString', {
    enumerable : false
})

for(let key in user){
    console.log(key);
}


configurable 플래그

어떤 프로퍼티의 configurable 플래그가 false로 설정돼 있다면 해당 프로퍼티는 객체에서 지울 수 없다.

즉, configurable 플래그를 false로 설정하면 돌이킬 방법이 없다. (defineProperty를 써도 안됨)

 

[예제]

let user = {
  name : 'mill',
  age : 15
};

Object.defineProperty(user, 'name', {
  configurable : false
});

delete user.name;
delete user.age;

//configurable 플래그를 수정할 수 없음
Object.defineProperty(user, 'name', {
  configurable : true
});

configurable:false가 만들어내는 구체적인 제약사항은 아래와 같다.

  1. configurable 플래그를 수정할 수 없음
  2. enumerable 플래그를 수정할 수 없음.
  3. writable: false의 값을 true로 바꿀 수 없음(true를 false로 변경하는 것은 가능함).
  4. 접근자 프로퍼티 get/set을 변경할 수 없음(새롭게 만드는 것은 가능함).

[예제 (이전 예제를 이어서 작성할 것)]

//현재의 value와 플래그 확인
Object.getOwnPropertyDescriptor(user, 'name');

//enumerable 플래그를 수정할 수 없음.
Object.defineProperty(user, 'name', {
  enumerable : false
});

//writable: true를 false로 변경하는 것은 가능함
Object.defineProperty(user, 'name', {
  writable : false
});

// writable: false의 값을 true로 바꿀 수 없음
Object.defineProperty(user, 'name', {
  writable : true
});


[공부 좌표]

프로퍼티 플래그와 설명자

 

[참고]

객체 순환 fon...in / 배열 순환 for...of

프로퍼티 플래그를 (특별한 방식으로)추가 / 변경 / 얻는 방법

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함