在Javascript中如何使用可以实例化的自定义行为制作数组?

时间:2013-07-04 10:46:44

标签: javascript prototype prototypal-inheritance

我需要一种“圆形阵列”。我有一切工作,但对于单个实例。我不知道如何让它“实例化”。我的意思是我希望它以下列方式工作:

var arr = ['a', 'b', 'c', 'd']; // it's kind of pseudo-code 
arr.getNext(); // gives a
arr.getNext(); // gives b
arr.getNext(); // gives c
arr.getNext(); // gives d
arr.getNext(); // gives a
arr.getNext(); // gives b
// and so on

我知道我可以在里面创建带有数组的对象并迭代它,但我很确定我可以用另一种方式做到这一点。

问题是我需要该对象的几个实例。如果它只是我能做的一个实例:

var arr = ['a', 'b', 'c', 'd'];
arr.getNext = function() {
  // ... I got this stuff working
}

如何允许创建此类自定义数组的多个实例?

3 个答案:

答案 0 :(得分:4)

即使您可以使用Object.defineProperty扩展Array.prototype(以创建不可枚举的属性),替代解决方案也可能会很有趣,具体取决于您的实际需求。

您可以定义一个在数组上返回迭代器的函数:

function iter(arr) {
    var index = -1;

    return {
        next: function() {
            index = (index + 1) % arr.length;
            return arr[index];
        }
    };
}

用法:

var it = iter(arr);
it.next();

答案 1 :(得分:1)

您可以扩展prototype,以便能够在Array的所有实例中使用它:

Array.prototype.getNext = function(){
  var next = this.shift();
  this.push(next);
  return next;
};

请注意,这会修改数组。

答案 2 :(得分:0)

您可以将getNext方法添加到Array原型中,如下所示:

Array.prototype.getNext = function ()
{
....
}

然后,您可以在您创建的任何阵列上调用此方法。