运行时收到许多未定义的调用,每个函数都说它是未定义的

时间:2019-02-17 20:42:26

标签: javascript

我到处都有不确定的值,这很烦人。我相信这可能是我用const设置输入的方法

const prod = new Product();
prod

还是其他吗?我相信已经尝试修复某些功能,例如将其退还给购买产品并用null修复我的toLowerCase。

var products = [];
class Product {
   constructor(productName, amount, cost) {
       this.productName = productName,
        this.amount = amount,
        this.cost = cost
   }

   buyProduct(product){
       products.push(product);
       return this;

   }
   deleteProduct(str){
       var found = products.find(function(element){
       })
       if(found)
       {
           if(found.amount>1)

           }
       }
   }




2 个答案:

答案 0 :(得分:1)

您不会从所有方法中返回this,因此无法链接所有这些方法。

  • sumPrice()仅在找到该项目时返回此值
  • deleteProduct()不返回此
  • sumTotal()都不是

此外,您的代码也被严重破坏。这是我为使其工作而进行的修复的列表:

  • 以所有方法返回该值。
  • amountquantity使用相同的属性名称
  • itemproductName使用相同的属性名称
  • amountcost中使用数字而不是字符串
  • 删除构造函数,它从未被调用
  • 使用let/const代替var

我也将Product类的名称更改为ProductsStore,因为您的类不仅管理一个产品,而且还管理所有产品,所以我将products[]数组移到该类中并对其进行了初始化在构造函数中。

class ProductsStore {
  constructor() {
    this.products = [];
  }

  buyProduct(product) {
    this.products.push(product);
    return this;
  }
  
  deleteProduct(str) {
    const found = this.products.find(el =>
      el.productName.toLowerCase() == str.toLowerCase())
    if (found) {
      if (found.amount > 1) {
        const foundIndex = this.products.findIndex(x => x.productName.toLowerCase() === str.toLowerCase());
        this.products[foundIndex].amount = found.amount - 1;
      } else {
        this.products.splice(this.products.findIndex(
          item => item.productName.toLowerCase() === str.toLowerCase()), 1)
      }
    }
    return this;
  }
   
  sumPrice(str, num) {
    const foundIndex = this.products.findIndex(x => (x.productName || '').toLowerCase() === str.toLowerCase());
    if (foundIndex >= 0) {
      this.products[foundIndex].cost = this.products[foundIndex].cost + num;
    }
    return this;
  }

  sumTotal() {
    this.total = 0;
    for (let obj of this.products) {
      this.total += obj.amount * obj.cost;
    }
    return this;
  }
  
  write() {
    let total = 0;
    for (let obj of this.products) {
      console.log('Item: ' + obj.productName + ' | Quantity:' + obj.amount + ' | Price:' + obj.cost);
      total += obj.amount * obj.cost;
    }
    console.log('$' + total);
  }
}

new ProductsStore()
  .buyProduct({ productName: 'jameson', amount: 1, cost: 0 })
  .buyProduct({ productName: 'bud light', amount: 3, cost: 0 })
  .buyProduct({ productName: 'corona', amount: 4, cost: 0 })
  .buyProduct({ productName: 'beer', amount: 1, cost: 0 })
  .sumPrice('tequila', 5.99)
  .deleteProduct('corona')
  .sumPrice('beer', 5.04)
  .sumTotal()
  .write();

答案 1 :(得分:0)

您应该从所有方法中返回“ this”。

某些方法未返回“ this”,例如:

sumPrice()

if(foundIndex>=0)
   {
       products[foundIndex].cost = products[foundIndex].cost + num;
   }
return this;// this should be returned here.

deleteProduct()

应在函数末尾返回“ this”。

sumTotal()

您应该返回此总计而不是返回总计。

最后,您应该返回总计的吸气剂。