是否可以继承和继承javascript数组?

我想拥有自己的自定义Array对象,该对象具有Array的所有功能,但包含其他属性。如果实例是我的CustomArray,我将使用myobj instanceof CustomArray执行特定操作。

在尝试子类化并遇到一些问题之后,我发现这篇Dean Edwards文章表明使用Array对象执行此操作不正确。事实证明Internet Explorer无法正确处理它。但是我也发现了其他问题(到目前为止,仅在Chrome中进行了测试)。

这是一些示例代码:

/**
 *  Inherit the prototype methods from one constructor into another
 *  Borrowed from Google Closure Library
 */
function inherits(childCtor, parentCtor) {
    function tempCtor() {};
    tempCtor.prototype = parentCtor.prototype;
    childCtor.superClass_ = parentCtor.prototype;
    childCtor.prototype = new tempCtor();
    childCtor.prototype.constructor = childCtor;
},

// Custom class that extends Array class
function CustomArray() {
    Array.apply(this, arguments);
}
inherits(CustomArray,Array);

array = new Array(1,2,3);
custom = new CustomArray(1,2,3);

在Chrome的控制台中输入以下内容即可得到此输出:
> custom
[]
> array
[1, 2, 3]
> custom.toString()
TypeError: Array.prototype.toString is not generic
> array.toString()
"1,2,3"
> custom.slice(1)
[]
> array.slice(1)
[2, 3]
> custom.push(1)
1
> custom.toString()
TypeError: Array.prototype.toString is not generic
> custom
[1]

显然,对象的行为不同。我应该放弃这种方法,还是有某种方法可以实现myobj instanceof CustomArray的目标?

最佳答案

Juriy Zaytsev(@kangax)今天刚刚发表了一篇关于该主题的非常好的文章。

他探索了各种替代方法,例如Dean Edwards iframe借用技术,直接对象扩展,原型(prototype)扩展以及ECMAScript 5访问器属性的用法。

最后,没有完美的实现,每个实现都有其优缺点。

绝对是一本好书:

  • How ECMAScript 5 still does not allow to subclass an array
  • 10-07 23:40