JS - 在函数中覆盖'this'

时间:2014-05-06 23:28:20

标签: javascript object

我正在尝试扩展Array原型:

Array.prototype.rotate = function() {
  var arr = [];
  for (var i = 0; i < this[0].length; ++i) {
    arr[i] = [];
    for (var j = 0; j < this.length; ++j) {
      arr[i].push(this[j][i])
    }
  }
  this = arr;
  return arr;
}

完全花花公子,直到this = arr。那爆炸了。

如何重新分配原型功能的this属性?我希望地狱能够处理以前的阵列配置。

修改

为什么我这样做?我希望它的行为与其他数组函数一样。例如,这有效:

myArray.pop();

我不需要这样做:

myArray = myArray.pop();

另一个编辑

我这样做是为了解决它,但它似乎很愚蠢:

Array.prototype.rotate = function() 
{
  var arr = [];
  var len = this[0].length;
  for (var i = 0; i < len; ++i) {
    arr[i] = [];
    for (var j = 0; j < this.length; ++j) {
      arr[i].push(this[j][i])
    }
  }
  for (var i = 0; i < this.length; ++i) {
    delete this[i];
  }
  for (var i = 0; i < arr.length; ++i) {
    this[i] = arr[i];
  }
  return arr;
}

这可行,但是,在一个例子中,当旋转这个数组时:

[[1, 1], [2, 2], [3, 3]]

我会得到:

[[1, 2, 3], [1, 2, 3], ]

看到那个空白的第三项?是的 - 这给我带来了麻烦。

3 个答案:

答案 0 :(得分:9)

虽然您无法覆盖this,但您肯定可以将工作数组的值设置为您在函数中构建的数组。像这样:

Array.prototype.rotate = function() {
  var arr = [];
  for (var i = 0; i < this[0].length; ++i) {
    arr[i] = [];
    for (var j = 0; j < this.length; ++j) {
      arr[i].push(this[j][i])
    }
  }
  this.length = 0; //empty the array
  this.push.apply(this, arr); //push all of the elements from arr onto this
  return arr;
}

答案 1 :(得分:0)

您无法修改this,但可以修改this[i][j],因此请将临时数组复制到this并循环播放。

答案 2 :(得分:0)

正如@Meredith所说,如果你修改它而不是新数组,你将得到你期望的结果。以下测试对我有用:

Array.prototype.rotate = function(){
    var a = this[0];
    this[0] = this[1];
    this[1] = a;
};

var test = [1,2];
test.rotate();
console.log(test); // [2,1]