我想创建一个JavaScript类vector
,这是一个零初始化数组。我可能希望稍后添加数学功能,但我不想牺牲本机类型的内存或性能质量,因为程序对大量数据进行操作。 (这基本上是科学的可视化。)
要在原型链中插入Array.prototype
,我尝试使用
vector.prototype = Object.create( Array.prototype );
Firefox给我一个错误
TypeError:在不兼容的对象上调用的Array.prototype.toSource
这是Firefox中的错误吗?它似乎适用于Webkit。
所以,我尝试使用更接近我想要的Float32Array
,并默认为零初始化。
var vector = function( size ) { Float32Array.call( this, size ); }
vector.prototype = Object.create( Float32Array.prototype );
在Firefox中,这会运行,但new
无法正确初始化对象。在Webkit new vector
中抛出异常。如果我使用vector.prototype = Float32Array.prototype
代替,则没有任何区别。
我从根本上要求太多吗?
答案 0 :(得分:3)
几乎不可能真正从JavaScript数组继承,因为该语言内置了非常特殊的功能以及它如何处理数组。您将看到大量答案,但大多数答案在特殊情况下会失败。 1)如果你继承它,它将失去特殊的长度属性。 2)如果你使用__ ProtoType __变量,它是非标准的,不适用于所有浏览器。 3)检查第三方库中的阵列有很多种方法可能会失败。可以使用instanceof Array.isArray和== ['Object Array']。
如需更详细的阅读,我建议您撰写本文How ECMA still does not allow to subclass array
我有一个返回真实数组并避免所有这些问题的解决方案。 这是小提琴Inhetit from JavaScript Array 小提琴上有检测,长度和功能测试。
var ArrayGenerator = (function () {
var args = [].slice.call(arguments);
var Arr = new Array();
var ovevar ArrayGenerator = (function () {
var args = [].slice.call(arguments);
var Arr = new Array();
var overiddenPush = Arr.push;
args.forEach(function (arg) {
Arr.push(arg);
});
args = null;
Arr.push = function (args) {
overiddenPush.apply(this, arguments);
}
Arr.TableName = "YourTable";
return Arr;
});
//像这样初始化你的数组
var MyArray=new ArrayGenerator(1,2,3);
您只需创建一个数组,将原始方法存储在内部变量中,并用您自己的方法替换公共方法。要调用基类,只需调用引用的方法而不是像常规继承对象那样的原型。