大家好,最近我在看阮老师的ES6标准入门,关于Symbol.species的地方不太懂 。
在书中描述:对象的Symbol.species
属性,指向当前对象的构造函数。创造实例时,默认会调用这个方法,即使用这个属性返回的函数当作构造函数,来创造新的实例对象。
我不太清楚具体是在什么时候调用的这个方法。
class MyArray extends Array{ static get [Symbol.species](){return Array;} } var a = new MyArray(1,2,3); console.log(a); var mapped = a.map(x => x * x); console.log(mapped instanceof MyArray);//false console.log(mapped instanceof Array); //true console.log(a instanceof Array); //true console.log(a instanceof MyArray);//true
以上是书中的例子,我自己加了几行输出。从输出看到,Symbol.species应该不是在创造a实例的时候调用的。
那么Symbol.species应该是在什么时候调用的呢。
执行var mapped = a.map(x => x * x);这一行的时候,具体的过程是什么样的,为什么会调用Symbol.species呢。
谢谢!
Array.prototype.map = function (callback) {
var Species = this.constructor[Symbol.species];
var returnValue = new Species(this.length);
this.forEach(function (item, index, array) {
returnValue[index] = callback(item, index, array);
});
return returnValue;
}