用另一个同类物体替换'this'

时间:2017-07-06 13:11:55

标签: javascript object

所以我有自己的Bicycle构造函数(简单示例):

function Bicycle (wheels, steer) {
  this.wheels = 2 + wheels;
  this.steer = wheels/steer;
}

Bicycle.prototype = {
  steer: function () {
    // do something
  },

  replace: function () {
    var bicycles = generateRandomBicycles();
    bicycles.sort(function (a, b) {
      return b.score - a.score;
    });

    this = bicycles[0];
  }
};

注意replace功能。我正在做类似的事情,但我实际上运行的是一种小型遗传算法,应该用更好的自行车代替现有的自行车。

我知道我可以这样做:

this.wheels = bicycles[0].wheels;
this.steer = bicycles[0].steer;

但有没有更明智的方法可以做到这一点?使用this = x会导致错误Parsing error: Assigning to rvalue

2 个答案:

答案 0 :(得分:1)

您无法重新分配this。正如@pointy在评论中指出的那样,你可以创建一个返回新自行车的函数:

function Bicycle (wheels, steer) {
  this.wheels = 2 + wheels;
  this.steer = wheels/steer;
}

Bicycle.prototype.replace = function () {
  var bicycles = generateRandomBicycles();
  bicycles.sort(function (a, b) {
    return b.score - a.score;
  });
  return bicycles[0];
};

const bike1 = new Bicycle(2, 1);
const bike2 = bike1.replace();

您可以将新实例分配给同一个变量:

let bike = new Bicycle(2, 1);
bike = bike.replace();

答案 1 :(得分:0)

@destroyer答案很好,应该这样做。但是以我问的方式回答我的问题,我最终做到了这一点:

  replace: function () {
    var bicycles = generateRandomBicycles();
    bicycles.sort(function (a, b) {
      return b.score - a.score;
    });

    for (var i in bicycles[0]) {
      this[i] = bicycles[0][i];
    }
  }

基本上复制所有属性。在这个for循环中使用hasOwnProperty也是值得的。