javascript - 从 Javascript 数组或类型化数组继承

标签 javascript arrays firefox inheritance

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

要在原型(prototype)链中插入Array.prototype,我尝试使用

vector.prototype = Object.create( Array.prototype );

Firefox 给我一个错误

TypeError: Array.prototype.toSource called on incompatible Object

这是 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 没有区别。

我是不是要求太多了?

最佳答案

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

要更详细的阅读,我建议这篇文章How ECMA still does not allow to subclass array

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

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. 允许您重写您想要的所有内容并添加自定义属性和方法,就像继承数组一样。

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

关于javascript - 从 Javascript 数组或类型化数组继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13428189/

相关文章:

javascript - 谷歌图表 : condensing hAxis values

javascript - 在 Angular 中有条件地添加 css 问题?

JavaScript "unique()"函数

javascript - 在 URL 栏中按下 ENTER 时如何更正 Firefox 中的#anchor 滚动位置

javascript - 如何在 Firefox 中从 JavaScript 解析 HTML?

javascript - 将 D3 条形图缩放到容器大小

javascript - Div 在单击时出现,在单击时消失

php - 如何删除键并从 PHP 数组返回值?

Java ArrayList<String[]>

javascript - mozilla firefox 中的对齐有缺陷,而 chrome 中的一切都很好