getter
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since 2015å¹´7æ.
get èªæ³æå°ç©ä»¶å±¬æ§ï¼ç¶å®å°å±¬æ§è¢«æª¢ç´¢æï¼æå¼å«çå½å¼ã
å試ä¸ä¸
const obj = {
log: ["a", "b", "c"],
get latest() {
return this.log[this.log.length - 1];
},
};
console.log(obj.latest);
// Expected output: "c"
èªæ³
{get prop() { ... } }
{get [expression]() { ... } }
忏
prop-
è¦ç¶å®å°çµ¦å®å½å¼çå稱ã
- expression
-
èª ECMAScript 2015 éå§ï¼å¯ä»¥ç¨è¨ç®å±¬æ§å稱ï¼computed property nameï¼ï¼ç¶å®å°çµ¦å®å½å¼ã
æè¿°
ææåï¼ç©ä»¶ç屬æ§å¯è½éè¦åå³åæ æ¸å¼ãæè¦å¨ä¸ä½¿ç¨æç¢ºçæ¹æ³å¼å«ä¸ï¼åæ åºå §é¨è®æ¸ççæ ãå¨ JavaScript å¯ä»¥ç¨ getter éå°éåç®çãå管å¯ä»¥ç¨ getter è setter çéè¯å»ºç«èæ¬å±¬æ§çé¡åï¼ä½ getter ç¡æ³è¢«ç¶å®å°åæææå¯¦éæ¸å¼ç屬æ§ã
ä½¿ç¨ get èªæ³æï¼è«æ³¨æä»¥ä¸æ
æ³ï¼
- å¯ä»¥ææä¸å以æ¸åæå串çºä»£è¡¨çæ¨ç¤ºç¬¦ï¼
- æå°è¦æé¶å忏ï¼è«åè¦ Incompatible ES5 change: literal getter and setter functions must now have exactly zero or one arguments çè©³ç´°è³æï¼
- ä¸è½ä»¥æå¦ä¸å
getç object literalãæç¸å屬æ§å ¥å£ï¼data entryï¼ç data å½¢å¼åºç¾ï¼ä¸è½ä½¿ç¨{ get x() { }, get x() { } }and{ x: ..., get x() { } }ï¼ã
getter å¯ä»¥ç¨ delete æä½ç¬¦ç§»é¤ã
示ä¾
>å¨ç©ä»¶åå§å¨ï¼object initializersï¼å §å®ç¾©æ°ç©ä»¶ç getter
éç¨å¼ç¢¼å°çµ¦ obj ç©ä»¶å»ºç«èæ¬å±¬æ§ 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); // Runs the getter, which yields a + 1 (which is 1)
使ç¨è¨ç®å±¬æ§å
var expr = "foo";
var obj = {
get [expr]() {
return "bar";
},
};
console.log(obj.foo); // "bar"
Smart / self-overwriting / lazy getters
Getter æä¾äºå®ç¾©ç©ä»¶å±¬æ§çæ¹æ³ï¼ä½å®æ¬èº«ä¸¦ä¸æå»èªåè¨ç®ï¼ç´å°æ³è¨ªåå®ãé¤ééè¦ç¨ getterï¼å¦åæ¸å¼è¨ç®æè¢«å»¶ç·©ï¼å¦æä¸éè¦ç¨å° getterï¼é£å°±æ°¸é ç¡é æ¯ä»è¨ç®çéé·ã
éå°å±¬æ§å¼ lazy æ delayã並æ«å以ç使ªä¾è¨ªåçæä½³åæå·§ç¨±ä½ smart æ memoized getterï¼å次è¨ç®ææå¼å« getterãæ¥è被æ«å以便å¨ä¸éç®çæ æ³ä¸åå¾çºè¨ªåãé種æå·§å¨ä»¥ä¸æ æ³ææ´¾ä¸ç¨å ´ï¼
- 妿æ¸å¼éé·å¾æè²´ï¼ä¾å¦éè¦å¤§é RAM æ CPU æéãç¢ç worker å·è¡ç·ã檢索é 端æä»¶çï¼
- 妿ç¾å¨ä¸¦ä¸éè¦æ¸å¼ï¼å¯è½æ¯ç¾å¨ç¨ä¸å°ãæå¨æäºæ æ³ä¸å®å ¨ç¨ä¸å°ã
- å¦æä½¿ç¨ç話ï¼è©²æ¸å¼æè¢«è¨ªåæ¸æ¬¡ãä¸è©²æ¸å¼æ°¸é ä¸ææ´æ¹ãæä¸æè©²æ´æ¹ã
ä¹å°±æ¯èªªï¼åºæ¼ getter 䏿鿰è¨ç®ççç±ï¼ä¸è¦éå°æ¸å¼é æææ¹è®ç屬æ§ï¼ä½¿ç¨ lazy getterã
ä¸ä¾çç©ä»¶ææä½çºèªå·±ç屬æ§ç getterãå¨åå¾è©²å±¬æ§å¾ï¼å®æå¾ç©ä»¶è¢«ç§»é¤ã並以é±å¼æ¸å¼å±¬æ§éæ°å¢å ãæå¾åå³ä¹ã
get notifier() {
delete this.notifier;
return this.notifier = document.getElementById('bookmarked-notification-anchor');
},
éå° Firefox ç¨å¼ç¢¼ï¼å¦è«åè¦å®ç¾© defineLazyGetter() å½å¼ç XPCOMUtils.jsm ç¨å¼æ¨¡å¡ã
get è defineProperty
å¨ä½¿ç¨ classes æï¼å管 get ééµåè Object.defineProperty() æåºç¾ç¸åçµæï¼ä½å
¶ä¸æå¾®å¦çå·®ç°ã
å¨ä½¿ç¨ 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 }
è¦ç¯
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-method-definitions> |