如何在javascript中为Array建立重复原型方法的原型

时间:2013-08-15 21:46:10

标签: javascript prototypal-inheritance

我正在尝试为js Array原型实现一个重复的方法,该方法将数组的副本连接到自身,如下所示:

[11,22,3,34,5,26,7,8,9].duplicate(); // [11,22,3,34,5,26,7,8,9,11,22,3,34,5,26,7,8,9]

这就是我所拥有的,但它会导致浏览器崩溃:

var array = [11,22,3,34,5,26,7,8,9];

Array.prototype.duplicate = function() {

  var j = this.length;

  for(var i = 0; i < this.length; i++) {
    this[j] = this[i];
    j++;
  }

  return this;
}

我正在尝试使用原生JS作为迭代和算法的实践,所以我试图避免使用内置方法,如果可能的话,这样我就可以更清楚地了解事情是如何被移动的。

关于它崩溃的原因以及我如何优化它的任何想法?

4 个答案:

答案 0 :(得分:6)

循环中的代码会改变数组的长度,所以它会不断增长,你永远不会到达它的末尾。获取变量中数组的初始长度并在循环条件中使用。您也可以将其用作目标索引的偏移量,而不是另一个计数器:

var array = [11,22,3,34,5,26,7,8,9];

Array.prototype.duplicate = function() {

  var len = this.length;

  for (var i = 0; i < len; i++) {
    this[len + i] = this[i];
  }

  return this;
}

答案 1 :(得分:1)

添加每个元素后,数组的长度会增加,因此您不能将其用作终结符。试试这个。

var j = this.length;

for(var i = 0; i < j; i++) {
    this[i+j] = this[i];
}

答案 2 :(得分:1)

这是最简单的代码

Array.prototype.duplicate = function () {
    var array = this;
    return array.concat(array);
};

答案 3 :(得分:1)

使用Spread语法; 在方法中,this 指的是 owner 对象

Array.prototype.duplicate = function () {
    return [...this, ...this]
};

let array = [1,2,3,4,5];

Array.prototype.duplicate = function () {
    return [...this, ...this]
};

console.log(array.duplicate());