handler.construct()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since 2016å¹´9æ.
handler.construct() ã¡ã½ããã¯ããªãã¸ã§ã¯ãã® [[Construct]] å
é¨ã¡ã½ããã«å¯¾ãããã©ããã§ããnew æ¼ç®åãªã©ã®æä½ã§ä½¿ç¨ããã¾ããçµæã¨ãã¦ã®ãããã·ã¼ãªãã¸ã§ã¯ãã new æ¼ç®åã使ç¨ã§ããããã«ããããã«ã¯ããããã·ã¼ãåæåããããã«ä½¿ç¨ãããã¿ã¼ã²ããèªä½ãæå¹ãªã³ã³ã¹ãã©ã¯ã¿ã¼ã§ããå¿
è¦ãããã¾ãã
試ãã¦ã¿ã¾ããã
function Monster(disposition) {
this.disposition = disposition;
}
const handler = {
construct(target, args) {
console.log(`Creating a ${target.name}`);
// äºæ³ãããçµæ: "Creating a monster1"
return new target(...args);
},
};
const ProxiedMonster = new Proxy(Monster, handler);
console.log(new ProxiedMonster("fierce").disposition);
// äºæ³ãããçµæ: "fierce"
æ§æ
new Proxy(target, {
construct(target, argumentsList, newTarget) {
}
})
弿°
次ã®å¼æ°ã construct() ã¡ã½ããã«æ¸¡ããã¾ãã this ã¯ãã³ãã©ã¼ã«ãã¤ã³ãããã¾ãã
target-
ã¿ã¼ã²ããã®ã³ã³ã¹ãã©ã¯ã¿ã¼ãªãã¸ã§ã¯ãã§ãã
argumentsList-
ã³ã³ã¹ãã©ã¯ã¿ã¼ã«æ¸¡ããã弿°ã®å ¥ã£ãé å (
Array) ã§ãã newTarget-
å¼ã³åºãããå ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ã§ãã
è¿å¤
construct ã¡ã½ããã¯æ°ãã使ããããªãã¸ã§ã¯ãã表ããªãã¸ã§ã¯ããè¿ãå¿
è¦ãããã¾ãã
解説
>ä»å ¥
ãã®ãã©ããã¯ä¸è¨ã®æä½ã«ä»å ¥ã§ãã¾ãã
- The
newæ¼ç®å:new myFunction(...args) Reflect.construct()
ä»ã«ãã[[Construct]] å
é¨ã¡ã½ãããå¼ã³åºãããããæä½ã«ä»å
¥ã§ãã¾ãã
ä¸å¤æ¡ä»¶
ãããã·ã¼ã® [[Construct]] å
é¨ã¡ã½ããã¯ã以ä¸ã®ä¸å¤æ¡ä»¶ã«éåãã¦ããå ´åãå¼ã³åºãããã¨ãã©ããã§ TypeError ãçºçãã¾ãã
targetãã³ã³ã¹ãã©ã¯ã¿ã¼èªèº«ã§ãªããã°ãªããªãã- è¿å¤ã¯
Objectã§ãªããã°ãªããªãã
ä¾
>new æ¼ç®åã®ãã©ãã
次ã®ã³ã¼ãã§ã¯ new æä½ããã©ãããã¾ãã
const p = new Proxy(function () {}, {
construct(target, argumentsList, newTarget) {
console.log(`called: ${argumentsList}`);
return { value: argumentsList[0] * 10 };
},
});
console.log(new p(1).value); // "called: 1"
// 10
次ã®ã³ã¼ãã§ã¯ä¸å¤æ¡ä»¶ã«éåãã¾ãã
const p = new Proxy(function () {}, {
construct(target, argumentsList, newTarget) {
return 1;
},
});
new p(); // TypeError is thrown
次ã®ã³ã¼ãã¯ãããã·ã¼ãæ£ããåæåãã¦ãã¾ããããããã·ã¼ã® target ã®åæåã¯ãããèªèº«ã new æ¼ç®åã«æå¹ãªã³ã³ã¹ãã©ã¯ã¿ã¼ã§ãªããã°ãªãã¾ããã
const p = new Proxy(
{},
{
construct(target, argumentsList, newTarget) {
return {};
},
},
);
new p(); // TypeError is thrown, "p" is not a constructor
仿§æ¸
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-proxy-object-internal-methods-and-internal-slots-construct-argumentslist-newtarget> |