Baseline Widely available
new.target
å
屿§å
è®¸ä½ æ£æµå½æ°ææé 彿°æ¯å¦æ¯éè¿ new
è¿ç®ç¬¦è¢«è°ç¨çãå¨éè¿ new
è¿ç®ç¬¦æ§è¡ç彿°ææé 彿°ä¸ï¼new.target
è¿åä¸ä¸ªæå new
è°ç¨çæé 彿°æå½æ°çå¼ç¨ã卿®éç彿°è°ç¨ä¸ï¼new.target
ç弿¯ undefined
ã
function Foo() {
if (!new.target) {
throw new TypeError("calling Foo constructor without new is invalid");
}
}
try {
Foo();
} catch (e) {
console.log(e);
// Expected output: TypeError: calling Foo constructor without new is invalid
}
è¯æ³ å¼
new.target
ä¿è¯æ¯ä¸ä¸ªå¯æé ç彿°å¼æ undefined
ã
new
è°ç¨çç±»ï¼è¿å¯è½æ¯å½åæé 彿°çåç±»ï¼å 为åç±»éè¿ super()
ä¼ éè°ç¨äºç¶ç±»çæé 彿°ãnew
æé çï¼å new.target
æå彿°æ¬èº«ã妿彿°ä¸æ¯éè¿ new
è°ç¨çï¼å new.target
æ¯ undefined
ã彿°å¯ä»¥è¢«ç¨ä½ extends
çåºç±»ï¼è¿ç§æ
åµä¸ new.target
å¯è½æååç±»ãReflect.construct()
è°ç¨çï¼é£ä¹ new.target
æåä½ä¸º newTarget
ä¼ éçå¼ï¼é»è®¤ä¸º target
ï¼ãnew.target
æ¯ä»å¨å´çä½ç¨åç»§æ¿çã妿ç®å¤´å½æ°ä¸æ¯å¨å¦ä¸ä¸ªå
·æ new.target
ç»å®çç±»æå½æ°ä¸å®ä¹çï¼å伿åºè¯æ³é误ãnew.target
æ¯ undefined
ãnew.target
è¯æ³ç±å
³é®å new
ãç¹åæ è¯ç¬¦ target
ç»æãç±äº new
æ¯ä¿çåèéæ è¯ç¬¦ï¼å
¶å¹¶ä¸æ¯å±æ§è®¿é®å¨ï¼èæ¯ä¸ç§ç¹æ®ç表达å¼è¯æ³ã
new.target
å
屿§å¨ææç彿°/类主ä½åå¯ç¨ãå¨å½æ°æç±»çå¤é¨ä½¿ç¨ new.target
ä¼å¯¼è´è¯æ³é误ã
卿®éç彿°è°ç¨ä¸ï¼åæé 彿°è°ç¨ç¸å¯¹ï¼ï¼new.target
ç弿¯ undefined
ãè¿ä½¿å¾ä½ å¯ä»¥æ£æµä¸ä¸ªå½æ°æ¯å¦æ¯ä½ä¸ºæé 彿°éè¿ new
被è°ç¨çã
function Foo() {
if (!new.target) {
throw new Error("å¿
é¡»éè¿ new æ¥è°ç¨ Foo()");
}
console.log("Foo æ¯éè¿ new è¿è¡åå§åç");
}
new Foo(); // è®°å½âFoo æ¯éè¿ new è¿è¡åå§åçâ
Foo(); // æåºâå¿
é¡»éè¿ new æ¥è°ç¨ Foo()â
æé 彿°ä¸ç new.target
å¨ç±»çæé 彿°ä¸ï¼new.target
æåç´æ¥è¢« new
æ§è¡çæé 彿°ã妿æé 彿°ä½äºç¶ç±»ä¸ï¼å¹¶ä¸æ¯ç±åç±»çæé 彿°å§æçï¼æ
åµä¹æ¯å¦æ¤ãnew.target
æå被 new
æè°ç¨çç±»ãä¾å¦ï¼å½éè¿ new B()
åå§å b
æ¶ï¼æå°åºäº B
çåç§°ï¼ç±»ä¼¼å°ï¼å¯¹äº a
ï¼æå°åºäºç±» A
çåç§°ã
class A {
constructor() {
console.log(new.target.name);
}
}
class B extends A {
constructor() {
super();
}
}
const a = new A(); // è®°å½âAâ
const b = new B(); // è®°å½âBâ
ä½¿ç¨ Reflect.construct() ç new.target
å¨ Reflect.construct()
åç±»åºç°ä¹åï¼é常éè¿ä¼ é this
çå¼ï¼å¹¶è®©åºç±»æé 彿°å¯¹å
¶è¿è¡æ´æ¹æ¥å®ç°ç»§æ¿ã
function Base() {
this.name = "åºç±»";
}
function Extended() {
// 让 Base() æé 彿°å¯å¨ç°æç `this` å¼ä¸å·¥ä½ï¼
// è䏿¯å¨ `new` åå»ºçæ°å¯¹è±¡ä¸å·¥ä½çå¯ä¸æ¹æ³ã
Base.call(this);
this.otherProperty = "åç±»";
}
Object.setPrototypeOf(Extended.prototype, Base.prototype);
Object.setPrototypeOf(Extended, Base);
console.log(new Extended()); // Extended { name: 'åºç±»', otherProperty: 'åç±»' }
ç¶èï¼call()
å apply()
å®é
䏿¯å¯¹å½æ°è¿è¡è°ç¨èéæé ï¼æä»¥ new.target
ç弿¯ undefined
ãè¿æå³ç妿 Base()
æ£æ¥å®æ¯å¦æ¯éè¿ new
æé çï¼å°ä¼æåºéè¯¯ï¼æè
å¯è½è¡¨ç°åºå
¶ä»æå¤çè¡ä¸ºï¼ãä¾å¦ï¼ä½ ä¸è½éè¿è¿ç§æ¹å¼æ©å± Map
ï¼å 为 Map()
æé 彿°ä¸è½å¨ä¸ä½¿ç¨ new
çæ
åµä¸è°ç¨ã
ææå
ç½®æé 彿°é½éè¿è¯»å new.target.prototype
ç´æ¥æé æ°å®ä¾çæ´ä¸ªååé¾ãå æ¤ï¼ä¸ºäºç¡®ä¿ï¼1ï¼Base
æ¯éè¿ new
æé çï¼ä»¥åï¼2ï¼new.target
æååç±»è䏿¯ Base
æ¬èº«ï¼æä»¬éè¦ä½¿ç¨ Reflect.construct()
ã
function BetterMap(entries) {
// è°ç¨åºç±»æé 彿°ï¼ä½å° `new.target` 设置为åç±»ï¼
// å æ¤å建çå®ä¾å
·ææ£ç¡®çååé¾ã
return Reflect.construct(Map, [entries], BetterMap);
}
BetterMap.prototype.upsert = function (key, actions) {
if (this.has(key)) {
this.set(key, actions.update(this.get(key)));
} else {
this.set(key, actions.insert());
}
};
Object.setPrototypeOf(BetterMap.prototype, Map.prototype);
Object.setPrototypeOf(BetterMap, Map);
const map = new BetterMap([["a", 1]]);
map.upsert("a", {
update: (value) => value + 1,
insert: () => 1,
});
console.log(map.get("a")); // 2
夿³¨ï¼ å®é
ä¸ï¼ç±äºç¼ºå° Reflect.construct()
ï¼å¨è½¬è¯ä¸º ES6 以åçä»£ç æ¶ï¼æ æ³æ£ç¡®å°å¯¹å
置对象è¿è¡åç±»åï¼ä¾å¦ Error
åç±»åï¼ã
使¯ï¼å¦æä½ æ£å¨ç¼å ES6 代ç ï¼æå¥½ä½¿ç¨ç±»å extends
ï¼å ä¸ºå®æ´æè¯»ä¸æ´å°åºéã
class BetterMap extends Map {
// æé 彿°è¢«çç¥ï¼å 为å®åªæ¯é»è®¤ç
upsert(key, actions) {
if (this.has(key)) {
this.set(key, actions.update(this.get(key)));
} else {
this.set(key, actions.insert());
}
}
}
const map = new BetterMap([["a", 1]]);
map.upsert("a", {
update: (value) => value + 1,
insert: () => 1,
});
console.log(map.get("a")); // 2
è§è æµè§å¨å
¼å®¹æ§ åè§
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4