我试图继承所有Array
的方法,而不使用ES6 class
语法糖。另外,我希望像new MyArray().map()
这样的方法返回MyArray
的实例。
简单说明我的问题:
class MyArrayES6 extends Array{}
new MyArrayES6().slice() instanceof MyArrayES6 //true
function MyArray(){}
MyArray.prototype = Object.create(Array.prototype)
MyArray.prototype.constructor = MyArray
MyArray[Symbol.species] = MyArray //Doing this doesn't affect the outcome
new MyArray().slice() instanceof MyArray //false, to my suprise!
A more complete code example 编辑:给出更清晰的例子
答案 0 :(得分:0)
问题是当对象不是数组时ArraySpeciesCreate不使用@@ species。
如果您不使用test{N}
,则默认情况下实例不会是数组。
如果你真的希望它能够工作,你仍然可以返回一个带有修改[[Prototype]]的真实数组:
extends Array

但这会伤害表现如此糟糕。更好地使用function ArraySub(){
return Object.setPrototypeOf([], ArraySub.prototype);
}
ArraySub.prototype = Object.create(Array.prototype)
ArraySub.prototype.constructor = ArraySub
ArraySub[Symbol.species] = ArraySub;
console.log( new ArraySub().slice() instanceof ArraySub );
。