Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/437.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否更改构造函数';创建其实例后的属性是否会影响实例?如果是的话,怎么办?_Javascript_Oop - Fatal编程技术网

Javascript 是否更改构造函数';创建其实例后的属性是否会影响实例?如果是的话,怎么办?

Javascript 是否更改构造函数';创建其实例后的属性是否会影响实例?如果是的话,怎么办?,javascript,oop,Javascript,Oop,假设这是构造函数: var Bike = function (speed) { this.speed = speed; }; 以下是创建的实例: var suzuki = new Bike(500); var hayabusa = new Bike(550); var honda = new Bike(400); 现在,我想做的是将所有自行车的速度更改为600 这可以通过逐个更改每个对象的属性来实现: suzuki.speed = 600; hayabusa.speed = 600; h

假设这是构造函数:

var Bike = function (speed) {
  this.speed = speed;
};
以下是创建的实例:

var suzuki = new Bike(500);
var hayabusa = new Bike(550);
var honda = new Bike(400);
现在,我想做的是将所有自行车的速度更改为
600

这可以通过逐个更改每个对象的属性来实现:

suzuki.speed = 600;
hayabusa.speed = 600;
honda.speed = 600;
不能通过改变类的属性来改变它吗

Bike.speed = 600;
新自行车(编号)。速度是实例变量

Bike.speed
将是“类”(对象)变量


这两个完全不同,彼此没有影响。

你不能这样做。您可以做的是稍后更改原型。但是,这将仅影响未定义该属性的实例:

var Bike = function(speed){
  if(speed) {
    this.speed = speed;
  }
};

Bike.prototype.speed = 100;

var suzuki = new Bike(500);
var hayabusa = new Bike();
var honda = new Bike();

console.log(suzuki.speed); //500
console.log(hayabusa.speed); //100
console.log(honda.speed); //100

Bike.prototype.speed = 200;

console.log(suzuki.speed); //500
console.log(hayabusa.speed); //200
console.log(honda.speed); //200
更改所有实例的唯一方法实际上是更改所有实例。但是,您可以在设置属性时保存日期,以及原型属性上的日期,并定义执行所需操作的getter:

var Bike = function(speed){
  Object.defineProperty(this, 'speed', {
    get() {

      if(this.speedMoment && this.speedMoment > Bike.speedMoment) {
        return this._speed;
      } else {
        return Bike._speed;
      }
    },
    set(val) {
      Bike._speedMomentIter++;
      this.speedMoment = Bike._speedMomentIter;
      this._speed = val;
    }
  });

  if(speed) {
    this.speed = speed;
  }
};
Bike._speedMomentIter = 0;

Object.defineProperty(Bike, 'speed', {
  set(val) {
    Bike._speedMomentIter++;
    this.speedMoment = Bike._speedMomentIter;
    this._speed = val;
  }
});

Bike.speed = 100;

var suzuki = new Bike(500);
var hayabusa = new Bike(800);
var honda = new Bike();

console.log(suzuki.speed); //500
console.log(hayabusa.speed); //800
console.log(honda.speed); //100

Bike.speed = 200;

console.log(suzuki.speed); //200
console.log(hayabusa.speed); //200
console.log(honda.speed); //200

谢谢你能告诉我上述问题的最佳解决方案吗?我应该骑新自行车吗(数字)。速度=600;或者有其他的最佳方法?你应该继续你的计划。使用
var bike\u name=新自行车(速度)
和设置每一个速度你的问题如果能做到,应该通过自己测试来回答。当你发现不能这样做,如果你的问题是“为什么”,那是因为语言的设计不允许这样做,谢天谢地。实际上我自己测试过。它不起作用。我是新来的。所以我想也许还有其他方法可以达到这个目的。这就是为什么最后的问题标题是“如果是,那么如何”。答案显然是否定的。一个更具说明性的问题是如何实现这样的目标。这就是我想要的答案。谢谢