【问题标题】:Add several class instances to a 'container' class property object将多个类实例添加到“容器”类属性对象
【发布时间】:2020-08-05 20:07:38
【问题描述】:

我创建了两个类,代表商店购物车的 jsCart 和代表产品的 jsProduct。

jsCart 应该有一个对象作为属性来存储 jsProduct 实例。

我的问题是如何将 jsProduct 实例添加到 jsCart 的该对象属性中。

这是 jsCart(相关位)

class jsCart {
  constructor() {
    this.products = {};
    this.sum = 0;     
  }

  set _products(product) {
    this.products[product.id] = product;
  }

  remove(id) {
    delete this.products[id];
  }

  updateSum() {
    for (var product in this.products) {
      this.sum += this.products[product]['sum'];
    }
  }
}

还有jsProduct(相关位):

class jsProduct {
  constructor(id, price, quantity) {
    this.id = id;
    this.price = price;
    this.quantity = quantity;
    this.sum = this.price * this.quantity;
  }

  set _quantity(n) {
    this.quantity = n;
    this.sum = this.price * this.quantity;
  }
}

我尝试将产品添加到购物车:

jsCart._products = new jsProduct('bananas',23,1);

这似乎确实有效,但是当我尝试添加另一个产品时,如果我正确使用 chrome 的控制台,它似乎覆盖了第一个:

也许我应该使用吸气剂来查看 .products 的内容?或者关于 setter 或我是如何使用它的?

谢谢

【问题讨论】:

  • 所以,只是为了让它不碍事。 Javascript 没有associative arrays。这不是你在这里使用的。您正在使用带有键值对的简单对象。
  • 不要(ab)使用_products setter 作为方法。如果你有remove(id),你也应该有add(id)(或add(product)
  • 谢谢@Taplar 我更正了。

标签: javascript oop ecmascript-6 es6-class


【解决方案1】:

首先,您不应该为您的类实例赋予与类 itselt 相同的名称。此外,Javascript 类名的约定是用 Pascal Casing 编写它们。

所以,在你的情况下,它会是:

class JSCart{
   ....
}

创建JSCart的实例:

let jsCart = new JSCart();

此外,我会考虑以你的方式使用 setter,因为 setter 没有设置 products 的值,但它添加向您的products 发送产品。更好的方法是创建一种方法来添加新产品。

从技术上讲,您的解决方案应该可行。唯一不起作用的是使用不存在的吸气剂检索您当前的产品(在您的情况下为jsCart._products)。相反,您可以将产品作为购物车的属性简单地访问。

Example for creating two products and retrieving the cart's products

此外,请重新考虑是否需要将产品存储在对象中。在我看来,数组更适合您的情况。 以您的方式使用对象时,您无法添加两个具有相同名称的产品(例如“apple”和“apple”),因为第二个产品会覆盖第一个产品。 使用对象的优点是可以通过名称直接访问产品。如果您不需要这个,而您只需要存储已添加到用户购物车的产品,则首选数组。

【讨论】:

  • 感谢您的回答和其他建议。在这种情况下,我想通过 id 访问产品,如果我使用对象,这似乎更容易。
【解决方案2】:

我会创建一个名为 addItem 的方法,然后将项目添加到“购物车”,而不是执行您正在执行的操作。

class jsCart {
  constructor() {
    this.products = {};
    this.sum = 0;     
  }
  //You don't really need this
  //set _products(product) {
  //  this.products[product.id] = product;
  //}

  //This should work
  addProduct(product){
    this.products[product.id] = product;
  }

  remove(id) {
    delete this.products[id];
  }

  updateSum() {
    for (var product in this.products) {
      this.sum += this.products[product]['sum'];
    }
  }
}

cart.addProduct(...);

【讨论】:

  • 解决了,谢谢。我想知道为什么二传手会那样做,你能解释一下吗?谢谢
  • @Jaume Mal,我认为唯一会导致这种奇怪行为的是它是一个设置器,而不是一个加法器。当设置这样的东西时,你说“嘿 _products 现在是(食物)”,然后你在检查器中查看 _products 方法,而不是 cart.products。做这样的事情通常仍然是不好的约定,但这就是你的问题所在
猜你喜欢
  • 1970-01-01
  • 2021-07-26
  • 2021-03-15
  • 2020-03-12
  • 1970-01-01
  • 2016-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多