getter

get 구문은 객체의 프로퍼티를 그 프로퍼티를 가져올 때 호출되는 함수로 바인딩합니다.

구문

{get prop() { ... } }
{get [expression]() { ... } }

매개변수

prop
주어진 함수를 바인딩할 프로퍼티의 이름입니다.
expression
ECMAScript 6가 도입되면서, 함수의 이름을 계산하기 위해 표현식을 사용할 수 있습니다.

설명

어떤 프로퍼티에 접근할 때마다 그 값을 계산하도록 해야 하거나, 내부 변수의 상태를 명시적인 함수 호출 없이 보여주고 싶을 때, JavaScript의 getter를 이용할 수 있습니다. getter가 바인딩된 프로퍼티는 동시에 실제 값을 가질 수는 없지만, getter와 setter를 동시에 바인딩해 일종의 유사 프로퍼티(pseudo-property)를 만들 수는 있습니다.

get 구문을 이용할 때는 다음을 유의하세요.

getter는 delete 연산자를 이용해 삭제할 수 있습니다.

getter를 객체 초기자에서 정의하기

객체 obj에 유사 프로퍼티 latest를 생성합니다. latest는 배열 log의 마지막 요소를 반환합니다.

var log = ['test'];
var obj = {
  get latest () {
    if (log.length == 0) return undefined;
    return log[log.length - 1]
  }
}
console.log (obj.latest); // "test"를 반환.

latest에 어떤 값을 할당하려고 시도해도 그 값이 바뀌지 않는다는 점을 유의하세요.

delete연산자를 이용해 getter 삭제하기

getter를 삭제하고 싶다면, delete를 이용하면 됩니다.

delete obj.latest;

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

이미 존재하는 객체에 getter를 추가하고자 한다면, Object.defineProperty()를 이용하면 됩니다.

var o = { a:0 }

Object.defineProperty(o, "b", { get: function () { return this.a + 1; } });

console.log(o.b) // getter를 실행합니다. a + 1 (= 1)이 반환됩니다.

계산된 (computed) 프로퍼티 이름

Note: 계산된 프로퍼티명은 ECMAscript6 제안서에 포함된 실험적인 기능이며, 아직 여러 브라우저에서 지원되지 않습니다. 이를 지원하지 않는 환경에서는 syntax error가 발생될 것입니다.

var expr = "foo";

var obj = {
  get [expr]() { return "bar"; }
};

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

똑똑한(Smart) / 스스로 덮어쓰는(self-overwriting) / 느긋한(lazy) getter

Getter는 객체에 프로퍼티를 정의할 수 있도록 하지만, 그 프로퍼티에 접근하기 전까지는 값을 계산하지 않습니다. getter는 값을 계산하는 비용을 실제 값이 필요할 때까지 미루며, 그 값이 필요없다면 계산 비용도 들지 않습니다.

또다른 최적화 기법으로는 계산 미루기와 함께 프로퍼티 값을 나중에 접근하기 위해 캐싱하는 것이 있습니다. 이를 똑똑한(smart), 혹은 메모화된(memoized) getter라고 부릅니다. 값은 getter가 호출될 때 처음 계산되며, 캐싱됩니다. 이후의 호출에는 다시 계산하지 않고 이 캐시값을 반환합니다. 이는 다음과 같은 상황에 유용합니다.

  • 값의 계산 비용이 큰 경우. (RAM이나 CPU 시간을 많이 소모하거나, worker thread를 생성하거나, 원격 파일을 불러오는 등)
  • 값이 당장은 필요하지 않지만 나중에 사용되어야 할 경우, 혹은 절대로 이용되지 않을 수도 있는 경우.
  • 값이 여러 차례 이용되지만 절대 변경되지 않아 매번 다시 계산할 필요가 없는 경우, 혹은 다시 계산되어서는 안 되는 경우.

똑똑한 getter는 값을 다시 계산하지 않기 때문에, 값의 변경이 예상되는 경우에는 똑똑한 getter를 이용해서는 안 됩니다.

다음 예제에서, 객체는 원래 프로퍼티로 getter를 가집니다. 프로퍼티를 가져올 때, getter는 삭제되며 대신 명시적인 값이 저장됩니다. 최종적으로 값을 반환합니다.

get notifier() {
  delete this.notifier;
  return this.notifier = document.getElementById("bookmarked-notification-anchor");
},

Firefox 코드의 경우,  defineLazyGetter() 함수를 정의하고 있는 XPCOMUtils.jsm 모듈을 참조하세요.

스펙

스펙 상태 설명
ECMAScript 5.1 (ECMA-262)
The definition of 'Object Initializer' in that specification.
Standard 최초로 정의되었습니다.
ECMAScript 2015 (6th Edition, ECMA-262)
The definition of 'Method definitions' in that specification.
Standard 계산된 프로퍼티 이름이 추가되었습니다.
ECMAScript 2017 Draft (ECMA-262)
The definition of 'Method definitions' in that specification.
Draft  

브라우저 호환성

Feature Chrome Firefox (Gecko) Internet Explorer Opera Safari
기본 지원 1 2.0 (1.8.1) 9 9.5 3
계산된 프로퍼티명 46 34 (34) No support No support No support
Feature Android Chrome for Android Firefox Mobile (Gecko) IE Mobile Opera Mobile Safari Mobile
기본 지원 (Yes) (Yes) 1.0 (1.8.1) (Yes) (Yes) (Yes)
계산된 프로퍼티명 47 No support 34.0 (34.0) No support No support No support

참조

문서 태그 및 공헌자

 이 페이지의 공헌자: NessunKim
 최종 변경: NessunKim,