Reflect.construct()
åºçº¿
广æ³å¯ç¨
èª 2016å¹´9æ èµ·ï¼æ¤ç¹æ§å·²å¨ä¸»æµæµè§å¨ä¸å¾å°æ¯æï¼å¯å¨å¤§å¤æ°è®¾å¤åæµè§å¨çæ¬ä¸æ£å¸¸ä½¿ç¨ã
Reflect.construct() æ¹æ³çè¡ä¸ºæç¹å new æä½ç¬¦ æé 彿°ï¼ç¸å½äºè¿è¡ new target(...args).
è¯æ³
Reflect.construct(target, argumentsList[, newTarget])
åæ°
target-
被è¿è¡çç®æ æé 彿°
argumentsList-
ç±»æ°ç»ï¼ç®æ æé 彿°è°ç¨æ¶çåæ°ã
newTargetå¯é-
ä½ä¸ºæ°å建对象çåå对象ç
constructor屿§ï¼åènew.targetæä½ç¬¦ï¼é»è®¤å¼ä¸ºtargetã
è¿åå¼
以targetï¼å¦ænewTargetåå¨ï¼å为newTargetï¼å½æ°ä¸ºæé 彿°ï¼argumentList为å
¶åå§ååæ°ç对象å®ä¾ã
å¼å¸¸
妿 target æè
newTarget 䏿¯æé 彿°ï¼æåºTypeError,å¼å¸¸ã
æè¿°
Reflect.constructå
è®¸ä½ ä½¿ç¨å¯åçåæ°æ¥è°ç¨æé 彿°ï¼è¿å使ç¨new æä½ç¬¦æé
对象å±å¼ç¬¦è°ç¨ä¸æ ·ã
var obj = new Foo(...args);
var obj = Reflect.construct(Foo, args);
Reflect.construct() vs Object.create()
卿°è¯æ³ Reflectåºç°ä¹åï¼æ¯éè¿æç¡®æå®æé 彿°ååå对象ï¼ä½¿ç¨Object.create()ï¼æ¥å建ä¸ä¸ªå¯¹è±¡çã
function OneClass() {
this.name = "one";
}
function OtherClass() {
this.name = "other";
}
// å建ä¸ä¸ªå¯¹è±¡ï¼
var obj1 = Reflect.construct(OneClass, args, OtherClass);
// ä¸ä¸è¿°æ¹æ³çæï¼
var 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
è½ç¶ä¸¤ç§æ¹å¼ç»æç¸åï¼ä½å¨å建对象è¿ç¨ä¸ä»ä¸ç¹ä¸åã
å½ä½¿ç¨Object.create()åFunction.prototype.apply()æ¶ï¼å¦æä¸ä½¿ç¨newæä½ç¬¦è°ç¨æé 彿°ï¼æé 彿°å
é¨çnew.targetå¼ä¼æåundefinedã
å½è°ç¨Reflect.construct()æ¥å建对象ï¼new.targetå¼ä¼èªå¨æå®å°targetï¼æè
newTargetï¼åææ¯ newTarget æå®äºï¼ã
function OneClass() {
console.log("OneClass");
console.log(new.target);
}
function OtherClass() {
console.log("OtherClass");
console.log(new.target);
}
var obj1 = Reflect.construct(OneClass, args);
// è¾åºï¼
// OneClass
// function OneClass { ... }
var obj2 = Reflect.construct(OneClass, args, OtherClass);
// è¾åºï¼
// OneClass
// function OtherClass { ... }
var obj3 = Object.create(OtherClass.prototype);
OneClass.apply(obj3, args);
// è¾åºï¼
// OneClass
// undefined
示ä¾
>ä½¿ç¨ Reflect.construct()
var d = Reflect.construct(Date, [1776, 6, 4]);
d instanceof Date; // true
d.getFullYear(); // 1776
è§è
| è§è |
|---|
| ECMAScript® 2027 Language Specification> # sec-reflect.construct> |