Добавьте несколько экземпляров класса в объект свойства класса «контейнер» - PullRequest
0 голосов
/ 22 апреля 2020

Я создал два класса: jsCart, представляющий корзину магазина, и jsProduct, представляющий продукт.

jsCart должен иметь объект как свойство для хранения экземпляров jsProduct.

My Вопрос в том, как добавить экземпляры 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, кажется, так как он перезаписывает первый:

enter image description here

Возможно ли, что я должен использовать геттер, чтобы увидеть содержимое .products? или что-то про сеттер или как я его использую?

Спасибо

Ответы [ 2 ]

1 голос
/ 22 апреля 2020

Прежде всего, вы не должны давать своим экземплярам классов то же имя, что и классу itselt. Кроме того, соглашение для Javascript имен классов записывает их в Pascal Casing.

Так, в вашем случае это будет:

class JSCart{
   ....
}

Чтобы создать экземпляр JSCart:

let jsCart = new JSCart();

Кроме того, я хотел бы рассмотреть возможность использования метода установки так, как вы сделали это в плохом стиле, потому что он не устанавливает значение для products, но оно добавляет продукт к вашему products. Лучшим способом было бы создать метод добавления нового продукта.

Технически ваше решение должно работать. Единственное, что не может работать - это получение ваших текущих продуктов с помощью геттера, который не существует (в вашем случае jsCart._products). Вместо этого вы можете просто получить доступ к продуктам как к свойству вашей корзины.

Пример создания двух продуктов и получения продуктов из корзины

Кроме того, подумайте, если вам нужно хранить ваши продукты в объекте. Мне кажется, что массив будет соответствовать вашему случаю лучше. При использовании объекта так, как вы это сделали, у вас нет возможности добавить два продукта с одинаковыми именами (например, «яблоко» и «яблоко»), поскольку второй продукт будет перезаписывать первый. Преимущество использования объекта заключается в непосредственном доступе к продукту по его имени. Если вам это не нужно и вам просто нужно хранить товары, которые были добавлены в корзину пользователя, предпочтите массив.

0 голосов
/ 22 апреля 2020

Я бы просто сделал метод 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(...);
...