在看MDN的描述時,遇到了疑惑。 MDN對這個方法是這麼描述的
你可能想要在擴充數組類別 MyArray 上傳回 Array 物件。例如,當使用例如 map() 這樣的方法傳回預設的建構函式時,你希望這些方法能夠傳回父級的 Array 對象,以取代 MyArray 物件。
// demo
class MyArray extends Array {
static get [Symbol.species]() {
return Array; // 1
}
}
var a = new MyArray(1, 2, 3); // 2
var mapped = a.map(x => x * x); // 3
console.log(mapped instanceof MyArray); // false
console.log(mapped instanceof Array); // true
依照我的理解,這個方法會在建立物件時觸發,得到的物件應該也是Array類型的實例。當調試發現程式碼執行到2時,並沒有跳到1處執行,而在執行3處的map方法時繼續執行到了1處。此時 a instanceof MyArray === true, a instanceof Array === true
。 3處執行完了之後會得到程式碼中的輸出結果。
到底這個方法會在何時觸發?為什麼a instanceof MyArray === true 但是 mapped instanceof MyArray === false?