继承自Javascript数组或类型数组

时间:2012-11-17 06:07:09

标签: javascript arrays firefox inheritance

我想创建一个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代替,则没有任何区别。

我从根本上要求太多吗?

1 个答案:

答案 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);
  1. 返回Real Array
  2. 无检测问题
  3. 允许您覆盖所需的所有内容,并添加自定义属性和方法,就像继承的数组一样。
  4. 您只需创建一个数组,将原始方法存储在内部变量中,并用您自己的方法替换公共方法。要调用基类,只需调用引用的方法而不是像常规继承对象那样的原型。