설정자

set 구문은 객체의 속성에 할당을 시도할 때 호출할 함수를 바인딩합니다.

시도해보기

구문

js
{set prop(val) { . . . }}
{set [expression](val) { . . . }}

매개변수

prop

주어진 함수를 바인딩할 속성 이름.

val

prop에 할당을 시도한 값.

expression

ECMAScript 2015 이후, 주어진 함수를 바인딩할 속성 이름을 구하는 표현식을 사용할 수도 있습니다.

설명

JavaScript의 설정자(setter)를 사용하면 지정한 속성 값의 변경을 시도할 때마다 함수를 호출할 수 있습니다. 설정자는 보통 접근자(getter)와 함께 '유사 속성'을 정의할 때 사용합니다. 어떤 속성에 설정자를 바인딩하는 동시에, 해당 속성이 값도 가지도록 할 수는 없습니다.

set 구문을 이용할 때는 다음 사항을 주의하세요.

  • 설정자의 식별자는 숫자나 문자열일 수 있습니다.
  • 설정자 함수는 최대 한 개의 매개변수만 가질 수 있습니다.
  • 객체 리터럴에서, 같은 속성 키에 다수의 설정자를 바인딩할 수 없습니다.
    js
    {
      set x() { }, set x() { }
    }
    
  • 객체 리터럴에서, 설정자는 데이터 속성과 같은 키를 사용할 수 없습니다.
    js
    {
      x: ..., set x() { }
    }
    

예제

객체 초기자에서 새로운 객체의 설정자 정의하기

다음 예제는 객체 language에 유사 속성 current를 생성합니다. current에 값을 할당하면, 해당 값을 log 속성에 저장합니다.

js
const language = {
  set current(name) {
    this.log.push(name);
  },
  log: [],
};

language.current = "EN";
console.log(language.log); // ['EN']

language.current = "FA";
console.log(language.log); // ['EN', 'FA']

current의 값은 정의하지 않았으므로, 할당이 아니라 접근을 시도하면 undefined만 반환하는 것에 주의하세요.

delete 연산자로 설정자 제거하기

접근자를 삭제하려면 간단히 delete (en-US) 연산자를 사용하세요.

js
delete language.current;

defineProperty를 이용해 이미 존재하는 객체에 설정자 정의하기

이미 존재하는 객체에 설정자를 추가하려면 Object.defineProperty()를 사용하세요.

js
const o = { a: 0 };

Object.defineProperty(o, "b", {
  set: function (x) {
    this.a = x / 2;
  },
});

o.b = 10;
// 설정자 실행, a 속성에 10 / 2 = 5 할당

console.log(o.a);
// 5

계산된 속성 이름 사용하기

js
const expr = "foo";

const obj = {
  baz: "bar",
  set [expr](v) {
    this.baz = v;
  },
};

console.log(obj.baz);
//  "bar"

obj.foo = "baz";
//  run the setter

console.log(obj.baz);
//  "baz"

명세

Specification
ECMAScript Language Specification
# sec-method-definitions

브라우저 호환성

BCD tables only load in the browser

See also