3

我想创建vector一个零初始化数组的 JavaScript 类。稍后我可能想添加数学功能,但我不想牺牲本机类型的内存或性能质量,因为该程序对大量数据进行操作。(它基本上是科学可视化。)

要插入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不会正确初始化对象。在 Webkitnew vector中抛出异常。如果我使用它没有区别vector.prototype = Float32Array.prototype

我从根本上要求太多了吗?

4

1 回答 1

3

几乎不可能真正从 JavaScript 数组继承,因为该语言内置了非常特殊的功能以及它处理数组的方式。你会看到很多答案,但大多数在特殊情况下都会失败。1)如果你继承它,它将失去特殊的长度属性。2) 如果你使用 __ProtoType __ 变量,它是非标准的,并且不适用于所有浏览器。3) 有很多方法可以检测 3rd 方库中的数组,这些方法在检查时可能会失败。instanceof Array.isArray 和 ==['Object Array'] 都可以使用。

对于更详细的阅读,我建议这篇文章如何 ECMA 仍然不允许子类化数组

我有一个返回真实数组并避免所有这些问题的解决方案。这是来自 JavaScript Array 的小提琴 Inhetit小提琴上 有检测、长度和功能测试。

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. 返回实数数组
  2. 没有检测问题
  3. 允许您覆盖您想要的所有内容并添加自定义属性和方法,就像继承数组一样。

您只需创建一个数组,将原始方法存储在内部变量中,然后用您自己的方法替换公共方法。要调用基类,您只需调用引用的方法,而不是像常规继承对象那样调用原型。

于 2015-05-23T03:04:24.083 回答