出于兴趣,是否可以通过旧的原型方法继承Array
?如果任何引擎支持它,那么理论上的以下内容是否会起作用?
function SubArray() {
super();
}
SubArray.prototype = Object.create(Array.prototype);
SubArary.prototype.constructor = SubArray;
SubArray.prototype.forEachRight ...
答案 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);
。