是否可以继承和继承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访问器属性的用法。
最后,没有完美的实现,每个实现都有其优缺点。
绝对是一本好书: