JavaScript - 使用Prototype

时间:2017-07-09 19:45:50

标签: javascript function constructor prototype

我有一个与在我的原型构造函数中使用if语句有关的问题。

我想做什么:

  1. 为Item构造函数创建方法calculatePrice。
  2. 默认情况下,此方法将返回对象的价格。
  3. 项目为水果,返回项目的价格减去5%。
  4. 代码     **不工作

    function Item(name, price){
      this.name = name;
      this.price = price;
    }
    
    Item.prototype.calculatePrice = function() {
      if (this.name === 'fruit') {
          this.price = this.price * 0.95
      } else {
          this.price = this.price;
      }
    }
    
    var ball = new Item('soccer ball', 15);
    ball.calculatePrice();
    // Expected results: 15
    
    var fruit = new Item('fruit', 10);
    fruit.calculatePrice();
    // Expected results: 9.5
    

    但是我的错误是我写if语句的方式。在没有给我解决方案的情况下,请你指点我犯错误的地方?谢谢。

3 个答案:

答案 0 :(得分:1)

您没有描述您的代码的期望和实际结果。但有一点我想到的是,您忘记在computePrice方法中返回this.price,因此结果为undefined而不是价格。即使使用当前版本,您也可以获得结果,但是您必须通过检查实例的price属性来明确地执行此操作,例如。 fruit.price。并且每次calculatePrice方法调用时价格也会发生变化。而是将this.price分配给局部变量,对该变量进行计算并将其返回。

答案 1 :(得分:0)

问题在于,如果您反复调用该方法,价格将继续下降(对于水果)。

else子句也没有做任何事情:你指定一个已经分配的值。

不是将计算结果存回this.price,而是将返回作为函数结果。那样this.price保持不变(没有意外的副作用),并且可以由对象的用户控制。然后该方法只返回结果:

var result = fruit.calculatePrice();

现在fruit.price仍然是原来的10,但result将是9.5

或者,您可以让函数将结果存储为对象属性,但最好是另一个属性(例如this.calculatedPrice)。

注意:根据要求,未提供实际的解决方案代码。如果您需要更多,请告诉我。

答案 2 :(得分:0)

更新:工作代码:

function Item(name, price){
  this.name = name;
  this.price = price;
}

Item.prototype.calculatePrice = function() {
  if (this.name === 'fruit') {
      return 0.95 * this.price;
 } else {
      return this.price;
  }
}

var ball = new Item('soccer ball', 15);
ball.calculatePrice();
// => 15

var fruit = new Item('fruit', 10);
fruit.calculatePrice();
// => 9.5