没有类的ES6子类数组

时间:2015-04-11 17:42:31

标签: javascript ecmascript-6

出于兴趣,是否可以通过旧的原型方法继承Array?如果任何引擎支持它,那么理论上的以下内容是否会起作用?

function SubArray() {
    super();
}
SubArray.prototype = Object.create(Array.prototype);
SubArary.prototype.constructor = SubArray;
SubArray.prototype.forEachRight ...

1 个答案:

答案 0 :(得分:1)

不,这是不可能的。不仅因为super()不完全是“旧的原型方法”,而且因为它不允许在构造函数之外:

  

§14.1.2 Static Semantics: Early Errors for function declarations and expressions

     

如果 FunctionBody Contains SuperCall true,则语法错误。

您需要将Array作为构造函数调用,因此Array.call(this, …)不起作用(与ES5中的方法不同)。但是,由于Reflect对象,应该可以伪造super()构造函数调用。我们会使用Reflect.construct

function SubArray() {
    return Reflect.construct(Array, [], SubArray)
}
…

请注意,您需要执行类似

的操作
function SubArray() {
    …
}
Reflect.setPrototypeOf(SubArray, Array);
Reflect.setPrototypeOf(SubArray.prototype, Array.prototype);

匹配新的class语义,而不是SubArray.prototype = Object.create(Array);