javascript - JS - 在函数中覆盖 'this'

标签 javascript object

我正在尝试扩展 Array 原型(prototype):

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。爆炸了。

如何重新分配原型(prototype)函数的 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], ]

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

最佳答案

虽然您不能覆盖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;
}

关于javascript - JS - 在函数中覆盖 'this',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23506221/

相关文章:

javascript - jsonlint 中的有效 JSON,但 JSON.parse() 不工作

JavaScript Object.keys 返回空数组

Javascript 是否可以创建特定对象的原型(prototype)数组?

Swift 二元运算符 '+=' 不能应用于类型为 'AnyObject!' 和 'String!' 的操作数

javascript - 更新 Redux 存储时,React 组件不会重新渲染

javascript - 将值附加到 JQuery 脚本中的输入字段

javascript - 将相同的数字数组对象与其他数组中的相同数字合并?

c - C中的面向对象

javascript - 防止浏览器加载拖放文件

javascript - 为 IE/Edge 中的 SVG 元素添加 .blur() 方法