본문으로 건너뛰기
홈
기술
기술 전체
프로그래밍68
컴퓨터 과학63
AI48
웹 개발36
인프라33
데이터31
소프트웨어 공학18
소개
← 목록으로프로그래밍 › JavaScript › 언어 기능

객체 프로퍼티와 프로퍼티 속성

목차

객체 프로퍼티와 프로퍼티 속성

객체의 프로퍼티(property)는 이름과 값의 연결이다. Object.defineProperty를 사용하면 값뿐 아니라 쓰기 가능 여부, 열거 여부, 재설정·삭제 가능 여부를 지정할 수 있다. 원문의 writeable과 configuration은 실제 속성 이름이 아니다. 각각 writable, configurable로 써야 설정이 적용된다.

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

데이터 프로퍼티는 value와 writable을 갖는다. 접근자 프로퍼티는 값을 직접 저장하는 대신 get·set 함수를 갖는다. 둘 다 enumerable과 configurable을 지정할 수 있다. 한 프로퍼티 설명자에 value와 get을 동시에 넣을 수 없다.

속성false 또는 생략했을 때의 의미
writable데이터 프로퍼티에 다른 값을 대입할 수 없음
enumerableObject.keys와 for...in에서 보이지 않음
configurable삭제하거나 대부분의 설명자 속성을 바꿀 수 없음

표의 기본값은 Object.defineProperty로 새 속성을 만들 때 기준이다. 일반적인 obj.key = value로 만든 속성은 보통 세 속성이 모두 true다. enumerable: false여도 obj.key로 직접 읽을 수 있다. “숨김”은 비밀 정보 보호를 뜻하지 않는다.

"use strict";
const user = {};
Object.defineProperty(user, "name", {
  value: "Paik",
  writable: true,
  enumerable: true,
  configurable: false,
});

let department = "Programmer";
Object.defineProperty(user, "department", {
  get() { return department; },
  set(next) { department = next; },
  enumerable: true,
  configurable: true,
});

Object.defineProperty(user, "greeting", {
  value() { return `Hi, I'm ${this.name}`; },
  enumerable: false,
  configurable: false,
});

user.department = "Software";
console.log(user.department);   // Software
console.log(user.greeting());   // Hi, I'm Paik
console.log(Object.keys(user)); // ['name', 'department']
console.log(Reflect.ownKeys(user)); // ['name', 'department', 'greeting']

department는 클로저 변수에 저장되므로 getter와 setter가 이를 읽고 바꾼다. greeting은 열거되지 않지만 직접 호출할 수 있다. 메서드에 화살표 함수를 쓰면 this가 호출 객체를 가리키지 않으므로 여기서는 일반 함수 문법을 사용했다. 원문의 두 코드 블록은 같은 코드를 중복했고, configuration을 넣어도 원하는 설정이 되지 않았다.

변경할 수 없는 설명자의 범위

configurable: false인 name은 삭제할 수 없고 열거 여부를 바꿀 수 없다. 그러나 writable: true이므로 user.name = "Kim"처럼 값을 바꾸는 것은 가능하다. writable을 나중에 false로 낮출 수는 있지만 다시 true로 올릴 수는 없다. 엄격 모드에서 금지된 대입은 오류가 나고, 비엄격 모드에서는 조용히 실패할 수 있다. Object.getOwnPropertyDescriptor(user, "name")로 실제 설정을 확인하면 디버깅이 쉽다.

접근자에 입력 검증을 넣을 수도 있지만 클라이언트 객체의 검증만으로 보안을 보장하지 않는다. API 경계에서도 값을 다시 검사해야 한다. 값의 단순 저장만 필요하면 평범한 객체 프로퍼티가 더 간단하고, 읽기·쓰기 동작이나 열거 규칙을 제어해야 할 때 설명자를 선택한다.

참고: MDN Object.defineProperty

같은 카테고리의 글