继承自Array

时间:2016-10-26 02:35:12

标签: ecmascript-6 symbols

我试图继承所有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 编辑:给出更清晰的例子

1 个答案:

答案 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 );