我可以在JavaScript中创建自己的数组对象吗?

Chr*_*phe 5 javascript arrays object

我创建了一个JavaScript应用程序,它有很多数组操作(排序,过滤等).

目前我的功能是这样的:

function (myArray, arg1, arg2,...)
Run Code Online (Sandbox Code Playgroud)

其中myArray是我正在处理的数组,而arg1,arg2,...是函数用来修改数组的参数.

我认为在对象和参数之间进行明确的分离会更简洁(la jQuery):

myArray.function(arg1, arg2,...)
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用Array.prototype将我的函数添加到所有数组,但是这看起来太重了,因为我添加的函数非常特定于我的情况,并且通常对数组没有意义.我也知道我可以创建一个对象,但是我不会受益于JavaScript中可用的数组方法(indexOf,filter等).

有没有办法可以创建自己的数组对象,继承默认数组方法并允许我添加自己的数组对象?

Eli*_*ing 8

你有两个选择:

选项一是通过向其Array添加新方法来扩展对象:

Array.prototype.myMethod = function(arg1, arg2)
{
    // Use 'this' to access the array.
}
Run Code Online (Sandbox Code Playgroud)

优点是每个javascript数组现在都有这个额外的方法.当多个(外部)javascript库尝试添加相同的方法时,这也是一个缺点.此外,这种新方法将出现在for(var item in myArray)可能有问题的结构中.

选项二是为扩展数组创建"工厂方法":

function MyExtendedArray = function()
{
    var array = [];
    array.myMethod = function(arg1, arg2) {
        // Use 'this' or 'array' to access the array.
    };

    return array;
};
Run Code Online (Sandbox Code Playgroud)

现在你可以写这个来创建一个新的扩展数组:

var arr = MyExtendedArray();
Run Code Online (Sandbox Code Playgroud)

  • 我认为工厂方法正是我特定应用程序所需要的。这太明显了...不是我看到的:-)谢谢! (2认同)

Mik*_*uel 5

Array不能被子类,并且仍然表现得像一个数组。具体来说,该length属性不会更改以反映从数组中添加或删除的元素。

function MyArray() {}
MyArray.prototype = [];
MyArray.prototype.constructor = MyArray;
var instance = new MyArray;
instance[0] = 0;
alert(instance.length);  // alerts 0
Run Code Online (Sandbox Code Playgroud)

发生这种情况的原因是因为只有通过new Array或语法糖创建的对象[]才能对长度进行特殊处理。

new MyArray上面创建一个普通对象,其原型是一个Array,但对没有new操作员检查是否一个对象的原型是一个Array并设置特殊length处理。


小智 5

您只需将函数直接添加到对象而不是原型:

var myArray = new Array();
myArray.myFunc = function(){ /* do stuff! */ };
myArray.myFunc();
Run Code Online (Sandbox Code Playgroud)