gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 10:49:20 25 4
gpt4 key购买 nike

我想创建一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com