Reflect.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æ.
Reflect.construct() ã¯éçã¡ã½ããã§ãnew æ¼ç®åã®ããã«ããã ã颿°ã¨ãã¦åä½ãã¾ãããã㯠new target(...args) ã®å¼ã³åºãã¨åçã§ããããã«ãå¥ã®ãnew.targetãå¤ãæå®ãããã¨ããããã¨ãã§ãã¾ãã
試ãã¦ã¿ã¾ããã
function func1(a, b, c) {
this.sum = a + b + c;
}
const args = [1, 2, 3];
const object1 = new func1(...args);
const object2 = Reflect.construct(func1, args);
console.log(object2.sum);
// äºæ³ãããçµæ: 6
console.log(object1.sum);
// äºæ³ãããçµæ: 6
æ§æ
Reflect.construct(target, argumentsList)
Reflect.construct(target, argumentsList, newTarget)
弿°
target-
å¼ã³åºã対象ã®é¢æ°ã
argumentsList-
targetãå¼ã³åºãéã®å¼æ°ãæå®ããé å風ãªãã¸ã§ã¯ãã newTargetçç¥å¯-
targetå ã®new.targetå¼ã®å¤ãããã©ã«ãã¯targetã§ããä¸è¬çã«ï¼ä¾ãåç §ï¼ãtargetã¯ãªãã¸ã§ã¯ããåæåãããã¸ãã¯ãæå®ããnewTarget.prototypeã¯æ§ç¯ããããªãã¸ã§ã¯ãã®ãããã¿ã¤ããæå®ãã¾ãã
è¿å¤
target (ã¾ãã¯ãããããã° newTarget) ã®æ°ããã¤ã³ã¹ã¿ã³ã¹ã§ã target ã« argumentsList ãæ¸¡ãã¦ã³ã³ã¹ãã©ã¯ã¿ã¼ã¨ãã¦å¼ã³åºããã¨ã§åæåãã¾ãã
ä¾å¤
TypeError-
targetã¾ãã¯newTargetãã³ã³ã¹ãã©ã¯ã¿ã¼ã§ã¯ãªãå ´åãã¾ãã¯argumentsListããªãã¸ã§ã¯ãã§ã¯ãªãå ´åã«çºçãã¾ãã
解説
Reflect.construct() ã¯ã³ã³ã¹ãã©ã¯ã¿ã¼å¼ã³åºãã®åå°çæå³ã¥ããæä¾ãã¾ããã¤ã¾ããReflect.construct(target, argumentsList, newTarget) ã¯æå³çã«æ¬¡ã®ãã®ã¨åçã§ãã
new target(...argumentsList);
new æ¼ç®åã使ç¨ããå ´åãtarget 㨠newTarget ã¯å¸¸ã«åãã³ã³ã¹ãã©ã¯ã¿ã¼ã§ãããã¨ã«æ³¨æãã¦ãã ããããã ããReflect.construct() ã使ç¨ããã¨ãç°ãªã new.target å¤ã渡ããã¨ãå¯è½ã§ããæ¦å¿µçã«ã¯ãnewTarget 㯠new ãå¼ã³åºããã颿°ã§ãããnewTarget.prototype ãæ§ç¯ããããªãã¸ã§ã¯ãã®ãããã¿ã¤ãã¨ãªãã¾ãã䏿¹ãtarget ã¯ãªãã¸ã§ã¯ããåæåããããã«å®éã«å®è¡ãããã³ã³ã¹ãã©ã¯ã¿ã¼ã§ããä¾ãã°ãã¯ã©ã¹ç¶æ¿ã«ãã㦠new.target ã¯ç¾å¨å®è¡ä¸ã®ã³ã³ã¹ãã©ã¯ã¿ã¼ã¨ã¯ç°ãªãå ´åãããã¾ãã
class A {
constructor() {
console.log(new.target.name);
}
}
class B extends A {}
new B(); // "B"
Reflect.construct() ã«ãã£ã¦ãå¯å¤é·å¼æ°ãæå®ãã¦ã³ã³ã¹ãã©ã¯ã¿ã¼ãå¼ã³åºããã¨ãã§ãã¾ããï¼ããã¯é常ã®ã³ã³ã¹ãã©ã¯ã¿ã¼å¼ã³åºãã§ã¹ãã¬ããæ§æãçµã¿åããã¦ä½¿ç¨ãããã¨ã§ãå¯è½ã§ããï¼
const obj = new Foo(...args);
const obj = Reflect.construct(Foo, args);
Reflect.construct() 㯠target ã® [[Construct]] ãªãã¸ã§ã¯ãå
é¨ã¡ã½ãããå¼ã³åºãã¾ãã
ä¾
>Reflect.construct() ã®ä½¿ç¨
const d = Reflect.construct(Date, [1776, 6, 4]);
d instanceof Date; // true
d.getFullYear(); // 1776
new.target ã®å¤æ´
newTarget ãæ¸¡ãããå ´åãã³ã³ã¹ãã©ã¯ã¿ã¼å
ã§ new.target ã®å¤ã夿´ãã¾ããçæããããªãã¸ã§ã¯ã㯠target ã§ã¯ãªã newTarget ã®ã¤ã³ã¹ã¿ã³ã¹ã¨ãªãã¾ãã
function OneClass() {
console.log("OneClass executed");
console.log(`new.target is ${new.target.name}`);
}
function OtherClass() {
console.log("OtherClass executed");
console.log(`new.target is ${new.target.name}`);
}
const obj1 = Reflect.construct(OneClass, []);
// ãã°åºå:
// OneClass executed
// new.target is OneClass
console.log(obj1 instanceof OneClass); // true
const obj2 = Reflect.construct(OneClass, [], OtherClass);
// ãã°åºå:
// OneClass executed
// new.target is OtherClass
console.log(obj2 instanceof OtherClass); // true
console.log(obj2 instanceof OneClass); // false
ãã¡ãããæ§ç¯ããããªãã¸ã§ã¯ãã®ãããã¿ã¤ããã§ã¼ã³ã«ã¤ãã¦ã¯ãã³ã³ã¹ãã©ã¯ã¿ã¼ã®å®è£
ã«ä¾åããããã確åºããä¿è¨¼ã¯ããã¾ãããä¾ãã°ãtarget ã³ã³ã¹ãã©ã¯ã¿ã¼ããªãã¸ã§ã¯ããè¿ãå ´åãnewTarget ã®å¤ã«é¢ãããããã®ãªãã¸ã§ã¯ããæ§ç¯ããããªãã¸ã§ã¯ãã¨ãªãã¾ããtarget ã construct ãã©ãããæã¤ãããã·ã¼ã§ããå ´åããã®ãã©ãããæ§ç¯ããã»ã¹ãå®å
¨ã«å¶å¾¡ãã¾ãã
function OneClass() {
return { name: "one" };
}
function OtherClass() {
return { name: "other" };
}
const obj1 = Reflect.construct(OneClass, [], OtherClass);
console.log(obj1.name); // 'one'
console.log(obj1 instanceof OneClass); // false
console.log(obj1 instanceof OtherClass); // false
æå¹ãª new.target ã¯ãprototype ããããã£ãæã¤ã³ã³ã¹ãã©ã¯ã¿ã¼é¢æ°ã§ããã¹ãã§ãããå¾è
ã¯å¼·å¶ããã¾ãããprototype ããããã£ã®å¤ããªãã¸ã§ã¯ãã§ãªãå ´åãåæåããããªãã¸ã§ã¯ã㯠Object.prototype ããç¶æ¿ãã¾ãã
function OneClass() {
console.log("OneClass executed");
console.log(`new.target is ${new.target.name}`);
}
function OtherClass() {
console.log("OtherClass executed");
console.log(`new.target is ${new.target.name}`);
}
OtherClass.prototype = null;
const obj = Reflect.construct(OneClass, [], OtherClass);
// ãã°åºå:
// OneClass executed
// new.target is OtherClass
console.log(Object.getPrototypeOf(obj) === Object.prototype); // true
Reflect.construct() 㨠Object.create()
Reflect ãå°å
¥ãããåã¯ããªãã¸ã§ã¯ããæ§ç¯ããã®ã«ã³ã³ã¹ãã©ã¯ã¿ã¼ã¨ãããã¿ã¤ãã®ä»»æã®çµã¿åããã§ Object.create() ã使ç¨ãã¦æ§ç¯ãããã¨ãã§ãã¾ããã
function OneClass() {
this.name = "one";
}
function OtherClass() {
this.name = "other";
}
const args = [];
const obj1 = Reflect.construct(OneClass, args, OtherClass);
const obj2 = Object.create(OtherClass.prototype);
OneClass.apply(obj2, args);
console.log(obj1.name); // 'one'
console.log(obj2.name); // 'one'
console.log(obj1 instanceof OneClass); // false
console.log(obj2 instanceof OneClass); // false
console.log(obj1 instanceof OtherClass); // true
console.log(obj2 instanceof OtherClass); // true
ãã® 2 ã¤ã®ææ³ã®æçµçµæã¯åãã§ããããã®éç¨ã«éè¦ãªéããããã¾ãã Object.create() 㨠Function.prototype.apply() ã使ç¨ããå ´åã new.target æ¼ç®åã¯ã³ã³ã¹ãã©ã¯ã¿ã¼å
ã§ undefined ãè¿ãã¾ããããã¯ã new æ¼ç®åãç¨ããªãããã§ããï¼å®éã«ã¯ãapply ã®æå³ã¥ãã使ç¨ãã¦ãããconstruct ã§ã¯ããã¾ããããã ããé常ã®é¢æ°ã¯ã»ã¼åãããã«åä½ãã¾ããï¼
䏿¹ã Reflect.construct() ãå¼ã³åºãå ´åã¯ã new.target æ¼ç®åã¯ãæä¾ããã¦ããã° newTarget ãæããããã§ãªããã° target ãæãã¾ãã
function OneClass() {
console.log("OneClass");
console.log(new.target);
}
function OtherClass() {
console.log("OtherClass");
console.log(new.target);
}
const obj1 = Reflect.construct(OneClass, args);
// ãã°åºå:
// OneClass
// function OneClass { ... }
const obj2 = Reflect.construct(OneClass, args, OtherClass);
// ãã°åºå:
// OneClass
// function OtherClass { ... }
const obj3 = Object.create(OtherClass.prototype);
OneClass.apply(obj3, args);
// Output:
// OneClass
// undefined
仿§æ¸
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-reflect.construct> |
ãã©ã¦ã¶ã¼ã®äºææ§
é¢é£æ å ±
Reflect.constructã®ããªãã£ã«ãcore-jsã«ããã¾ãReflectnewnew.targethandler.construct()