get
구문은 객체의 프로퍼티를 그 프로퍼티를 가져올 때 호출되는 함수로 바인딩합니다.
구문
{get prop() { ... } } {get [expression]() { ... } }
매개변수
prop
- 주어진 함수를 바인딩할 프로퍼티의 이름입니다.
- expression
- ECMAScript 6가 도입되면서, 함수의 이름을 계산하기 위해 표현식을 사용할 수 있습니다.
설명
어떤 프로퍼티에 접근할 때마다 그 값을 계산하도록 해야 하거나, 내부 변수의 상태를 명시적인 함수 호출 없이 보여주고 싶을 때, JavaScript의 getter를 이용할 수 있습니다. getter가 바인딩된 프로퍼티는 동시에 실제 값을 가질 수는 없지만, getter와 setter를 동시에 바인딩해 일종의 유사 프로퍼티(pseudo-property)를 만들 수는 있습니다.
get
구문을 이용할 때는 다음을 유의하세요.
- 숫자나 문자열로 구성된 식별자를 이용할 수 있습니다.
- getter는 절대로 매개변수를 가져서는 안 됩니다. (Incompatible ES5 change: literal getter and setter functions must now have exactly zero or one arguments 를 참조하세요.)
- 하나의 객체 리터럴에 또다른 getter나 데이터 바인딩은 불가능합니다. (
{ get x() { }, get x() { } }
나{ x: ..., get x() { } }
는 사용할 수 없습니다.)
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 |
참조
- setter
delete
Object.defineProperty()
__defineGetter__
__defineSetter__
- Defining Getters and Setters in JavaScript Guide