get
Baseline
åºãå©ç¨å¯è½
ãã®æ©è½ã¯åºãå®è£ ããã¦ãããå¤ãã®ãã¼ã¸ã§ã³ã®ç«¯æ«ããã©ã¦ã¶ã¼ã§åä½ãã¾ãã2015å¹´7æä»¥éããã¹ã¦ã®ãã©ã¦ã¶ã¼ã§å©ç¨å¯è½ã§ãã
get æ§æã¯ããªãã¸ã§ã¯ãã®ããããã£ã颿°ã«çµã³ã¤ããããããã£ãåç
§ãããæã«é¢æ°ãå¼ã³åºãããããã«ãã¾ããããã¯ã¯ã©ã¹ã§ã使ç¨ã§ãã¾ãã
試ãã¦ã¿ã¾ããã
const obj = {
log: ["a", "b", "c"],
get latest() {
return this.log[this.log.length - 1];
},
};
console.log(obj.latest);
// äºæ³ãããçµæ: "c"
æ§æ
{ get prop() { /* ⦠*/ } }
{ get [expression]() { /* ⦠*/ } }
追å ã®æ§æä¸ã®å¶éãããã¤ãããã¾ãã
- ã²ãã¿ã¼ã®å¼æ°ã¯æ£ç¢ºã«ã¼ãåã§ãªããã°ãªãã¾ããã
弿°
prop-
ä¸ãããã颿°ã«çµã³ä»ããããããããã£ã®ååã§ããä»ã®ããããã£ã®ãªãã¸ã§ã¯ãåæååã¨åãæ¹æ³ã§ãæååãªãã©ã«ãæ°å¤ãªãã©ã«ãèå¥åã®ããããã«ãããã¨ãã§ãã¾ãã
expression-
ç®åºããããã£å (computed property name) ã®å¼ã使ç¨ãã¦é¢æ°ã«çµã³ä»ãããã¨ãã§ãã¾ãã
解説
æã¨ãã¦ãåçã«è¨ç®ããå¤ãè¿ãããããã£ã«ã¢ã¯ã»ã¹ã許å¯ããã»ããæã¾ããå ´åããæç¤ºçãªã¡ã½ãããå¼ã³åºããã¨ãªãå é¨å¤æ°ã«ç¶æ ãåæ ããããå ´åãããã¾ãã JavaScript ã§ã¯ããã²ãã¿ã¼ãã使ã£ã¦ãããè¡ããã¨ãå¯è½ã§ãã
ãªãã¸ã§ã¯ãã®ããããã£ã¯ããã¼ã¿ããããã£ãã¢ã¯ã»ãµã¼ããããã£ã®ããããã§ããã両æ¹ãåæã«æã¤ãã¨ã¯ã§ãã¾ããã詳細㯠Object.defineProperty() ãåç
§ãã¦ãã ãããã²ãã¿ã¼æ§æã使ç¨ããã¨ããªãã¸ã§ã¯ãåæååå
ã§ã²ãã¿ã¼é¢æ°ãæå®ãããã¨ãã§ãã¾ãã
const obj = {
get prop() {
// ã²ãã¿ã¼ãobj. prop ãåç
§ããéã«å®è¡ãããã³ã¼ã
return someValue;
},
};
ãã®æ§æã使ç¨ãã¦å®ç¾©ãããããããã£ã¯ã使ããããªãã¸ã§ã¯ãã®èªèº«ã®ããããã£ã§ãããè¨å®å¯è½ãã¤åæå¯è½ã§ãã
ä¾
>ãªãã¸ã§ã¯ãåæååã«ãããæ°ãããªãã¸ã§ã¯ãã®ã²ãã¿ã¼ã®å®ç¾©
以ä¸ã®ä¾ã§ã¯ latest æ¬ä¼¼ããããã£ããªãã¸ã§ã¯ã obj 使ãã log å
ã®æå¾ã®é
åã¢ã¤ãã ãè¿ãã¾ãã
const obj = {
log: ["example", "test"],
get latest() {
return this.log.at(-1);
},
};
console.log(obj.latest); // "test"
latest ã«å¤ã代å
¥ãããã¨ãã¦ãã夿´ã¯ãããªããã¨ã«æ³¨æãã¦ãã ããã
ã¯ã©ã¹å ã§ã®ã²ãã¿ã¼ã®ä½¿ç¨
ã¯ã©ã¹ã¤ã³ã¹ã¿ã³ã¹ã§å©ç¨ã§ãããããªãã¯ã¤ã³ã¹ã¿ã³ã¹ã²ãã¿ã¼ãå®ç¾©ããéã«ããã¾ã£ããåãæ§æã使ç¨ãããã¨ãã§ãã¾ããã¯ã©ã¹å ã§ã¯ãã¡ã½ããéãã«ã³ãã§åºåãå¿ è¦ã¯ããã¾ããã
class ClassWithGetSet {
#msg = "hello world";
get msg() {
return this.#msg;
}
set msg(x) {
this.#msg = `hello ${x}`;
}
}
const instance = new ClassWithGetSet();
console.log(instance.msg); // "hello world"
instance.msg = "cake";
console.log(instance.msg); // "hello cake"
ã²ãã¿ã¼ããããã£ã¯ã¯ã©ã¹ã® prototype ããããã£ä¸ã«å®ç¾©ãããããããã®ã¯ã©ã¹ã®ãã¹ã¦ã®ã¤ã³ã¹ã¿ã³ã¹ã§å
±æããã¾ãããªãã¸ã§ã¯ããªãã©ã«å
ã®ã²ãã¿ã¼ããããã£ã¨ã¯ç°ãªããã¯ã©ã¹å
ã®ã²ãã¿ã¼ããããã£ã¯åæå¯è½ã§ã¯ããã¾ããã
éçã²ãã¿ã¼ã¨ãã©ã¤ãã¼ãã²ãã¿ã¼ã¯ããä¼¼ãæ§æã使ç¨ãããã¨ãã§ãã¾ããããã㯠static ããã³ãã©ã¤ãã¼ãè¦ç´ ã®ãã¼ã¸ã§èª¬æãã¦ãã¾ãã
delete æ¼ç®åã«ããã²ãã¿ã¼ã®åé¤
ã²ãã¿ã¼ãåé¤ãããå ´åã¯ã delete ã使ç¨ãã¦ãã ããã
delete obj.latest;
æ¢åã®ãªãã¸ã§ã¯ãã¸ã® defineProperty ã使ç¨ããã²ãã¿ã¼ã®å®ç¾©
æ¢åã®ãªãã¸ã§ã¯ãã«ä»»æã®ã¿ã¤ãã³ã°ã§ã²ãã¿ã¼ã追å ããã«ã¯ã Object.defineProperty() ã使ç¨ãã¦ãã ããã
const o = { a: 0 };
Object.defineProperty(o, "b", {
get() {
return this.a + 1;
},
});
console.log(o.b); // getter ãå®è¡ãa + 1 ãç®åºãã (çµæã¯ 1)
ç®åºããããã£åã®ä½¿ç¨
const expr = "foo";
const obj = {
get [expr]() {
return "bar";
},
};
console.log(obj.foo); // "bar"
éçã²ãã¿ã¼ã®å®ç¾©
class MyConstants {
static get foo() {
return "foo";
}
}
console.log(MyConstants.foo); // 'foo'
MyConstants.foo = "bar";
console.log(MyConstants.foo); // 'foo' ã§ããéçã²ãã¿ã¼ã®å¤ã¯å¤æ´ã§ãã¾ãã
ã¹ãã¼ã / èªå·±æ¸ãæã / é å»¶ã²ãã¿ã¼
ã²ãã¿ã¼ã¯ãªãã¸ã§ã¯ãã®ããããã£ãå®ç¾©ããææ®µãæä¾ãã¾ãããã¢ã¯ã»ã¹ãããã¾ã§ããããã£ã®å¤ãè¨ç®ãã¾ãããã²ãã¿ã¼ã¯å¤ãè¨ç®ããã³ã¹ãããå¤ãå¿ è¦ã«ãªãã¾ã§å éããã¾ããå¤ãå¿ è¦ã§ãªããã°ããã®ã³ã¹ããè² æ ãã¾ããã
ããããã£ã®å¤ã®è¨ç®ãå éããããå¾ã®ã¢ã¯ã»ã¹ã®ããã«ãã£ãã·ã¥ããããã®ä»å çãªæé©åæè¡ããã¹ãã¼ãï¼ã¾ã㯠ã¡ã¢åï¼ã²ãã¿ã¼ã§ããåãã¦ã²ãã¿ã¼ã«ã¢ã¯ã»ã¹ãããã¨ãã«ãå¤ãè¨ç®ãã¦ãã£ãã·ã¥ãã¾ãã以éã®ã¢ã¯ã»ã¹ã§ã¯åè¨ç®ããã«ããã£ãã·ã¥ããå¤ãè¿ãã¾ããããã¯æ¬¡ã®ãããªç¶æ³ã§å½¹ã«ç«ã¡ã¾ãã
- ããããã£ã®å¤ã®è¨ç®ã³ã¹ããé«ãå ´å (大éã® RAM ã CPU æéã使ç¨ãããã¯ã¼ã«ã¼ã¹ã¬ãããçæããããªã¢ã¼ãã®ãã¡ã¤ã«ãèªã¿è¾¼ããªã©)ã
- å¤ãããã«å¿ è¦ã§ã¯ãªãå ´åãå¤ãå¾ã§ä½¿ç¨ããããããã¯ã¾ã£ãã使ç¨ããªãå ´åãããç¶æ³ã
- ä½åº¦ãã¢ã¯ã»ã¹ãããå¤ã§ãå¤ã夿´ãããªãããåè¨ç®ã®å¿ è¦ããªãããããã¯åè¨ç®ãã¹ãã§ã¯ãªãå ´åã
ã¡ã¢: å¤ãå¤ããã¨è¦è¾¼ã¾ããããããã£ã§ãé å»¶ã²ãã¿ã¼ã使ç¨ãã¦ã¯ããã¾ãããã²ãã¿ã¼ãé å»¶ã§ããå ´åãå¤ãåè¨ç®ããªãããã§ãã
ãªããã²ãã¿ã¼ã®æ¬è³ªã¯ãé å»¶ãããã¡ã¢åãã§ã¯ããã¾ããããã®åä½ãæãå ´åããã®æè¡ãå®è£ ããå¿ è¦ãããã¾ãã
以ä¸ã®ä¾ã§ã¯ããªãã¸ã§ã¯ããèªèº«ã®ããããã£ã¨ãã¦ã²ãã¿ã¼ãæã£ã¦ãã¾ããããããã£ãåå¾ããã¨ãããããã£ã¯ãªãã¸ã§ã¯ãããåé¤ãããå¾ã«å追å ããã¾ããããã®ã¨ãæé»çã«ãã¼ã¿ããããã£ã¨ãã¦è¿½å ããã¾ããæçµçã«ãå¤ãè¿ããã¾ãã
const obj = {
get notifier() {
delete this.notifier;
this.notifier = document.getElementById("bookmarked-notification-anchor");
return this.notifier;
},
};
get 㨠defineProperty
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® 2027 Language Specification > # sec-method-definitions > |
ãã©ã¦ã¶ã¼ã®äºææ§
é¢é£æ å ±
- ã²ãã¿ã¼ã¨ã»ãã¿ã¼ã®å®ç¾© (JavaScript ã¬ã¤ã)
- ãªãã¸ã§ã¯ãã§ã®ä½æ¥ã¬ã¤ã
- 颿°
setObject.defineProperty()- ãªãã¸ã§ã¯ãåæåå
class- ããããã£ã¢ã¯ã»ãµã¼
- Incompatible ES5 change: literal getter and setter functions must now have exactly zero or one arguments by Jeff Walden (2010)
- More SpiderMonkey changes: ancient, esoteric, very rarely used syntax for creating getters and setters is being removed by Jeff Walden (2010)