get
구문은 객체의 프로퍼티를 그 프로퍼티를 가져올 때 호출되는 함수로 바인딩합니다.
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
구문
{get prop() { ... } } {get [expression]() { ... } }
매개변수
prop
- 주어진 함수를 바인딩할 프로퍼티의 이름입니다.
- expression
- ECMAScript 2015가 도입되면서, 함수의 이름을 계산하기 위해 표현식을 사용할 수 있습니다.
설명
어떤 프로퍼티에 접근할 때마다 그 값을 계산하도록 해야 하거나, 내부 변수의 상태를 명시적인 함수 호출 없이 보여주고 싶을 때, 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 obj = {
log: ['example','test'],
get latest() {
if (this.log.length == 0) return undefined;
return this.log[this.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) 프로퍼티 이름
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 모듈을 참조하세요.
get
Vs. defineProperty
While using the get
키워드와 Object.defineProperty()
를 사용하면 비슷한 결과를 얻지만, classes
에서 사용되는 두 가지 경우에는 미묘한 차이가 있습니다.
get을 사용할 때 속성은 Object.defineProperty()
를 사용하는 동안 객체의 프로토 타입에 정의 될 것이고, 속성은 그것이 적용되는 인스턴스에 정의 될 것입니다.
class Example {
get hello() {
return 'world';
}
}
const obj = new Example();
console.log(obj.hello);
// "world"
console.log(Object.getOwnPropertyDescriptor(obj, 'hello'));
// undefined
console.log(Object.getOwnPropertyDescriptor(Object.getPrototypeOf(obj), 'hello'));
// { configurable: true, enumerable: false, get: function get hello() { return 'world'; }, set: undefined }
스펙
스펙 | 상태 | 설명 |
---|---|---|
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 (ECMA-262) The definition of 'Method definitions' in that specification. |
Living Standard |
브라우저 호환성
BCD tables only load in the browser
The compatibility table on this page is generated from structured data. If you'd like to contribute to the data, please check out https://github.com/mdn/browser-compat-data and send us a pull request.
참조
- setter
delete
Object.defineProperty()
__defineGetter__
__defineSetter__
- Defining Getters and Setters in JavaScript Guide