JS购物车类:如何用单个方法修改多个构造函数属性?
问题分析与解决方案
当前addItem方法失效的核心问题是对itens属性的操作逻辑错误:如果itens是用来存储商品集合的数组/对象,用+=会将其转为字符串拼接(比如数组会变成[object Object][object Object]这类无效内容),而非正确添加商品条目。另外你的实现也没同步更新valorTotal,下面给出几种可行的实现方案:
方案1:用数组存储商品明细(支持重复添加同商品累加数量)
调整类的初始化逻辑,让itens以数组形式存储每个商品的完整信息(名称、单价、数量),addItem方法负责检查商品是否已存在,同步更新数量、总数量和总价:
class Carrinho { constructor() { // 初始化空数组存储商品,总数量和总价默认0 this.itens = []; this.quantidade = 0; this.valorTotal = 0; } addItem(nomeItem, precoUnitario, quantidadeAdicionada) { // 查找购物车中是否已有该商品 const itemExistente = this.itens.find(item => item.nome === nomeItem); if (itemExistente) { // 已有商品,累加数量 itemExistente.quantidade += quantidadeAdicionada; } else { // 新商品,添加到数组 this.itens.push({ nome: nomeItem, preco: precoUnitario, quantidade: quantidadeAdicionada }); } // 更新总数量和总价 this.quantidade += quantidadeAdicionada; this.valorTotal += precoUnitario * quantidadeAdicionada; } }
方案2:用对象(或Map)存储商品,按标识快速查找
如果商品有唯一标识(比如ID或名称),用对象存储能更高效地定位已有商品,避免数组遍历的开销:
class Carrinho { constructor() { this.itens = {}; // 键:商品名称/ID,值:{ preco, quantidade } this.quantidade = 0; this.valorTotal = 0; } addItem(idItem, precoUnitario, quantidadeAdicionada) { if (this.itens[idItem]) { this.itens[idItem].quantidade += quantidadeAdicionada; } else { this.itens[idItem] = { preco: precoUnitario, quantidade: quantidadeAdicionada }; } this.quantidade += quantidadeAdicionada; this.valorTotal += precoUnitario * quantidadeAdicionada; } }
关于是否需要为每个属性单独写方法
不需要。itens、quantidade、valorTotal是强关联的属性:添加商品必然会同时改变商品集合、总数量和总价,一个addItem方法就能完成所有关联属性的更新,单独写方法反而会增加冗余,还容易出现数据不一致的问题。
内容的提问来源于stack exchange,提问作者Rodhis
相关产品推荐
相关产品推荐

