You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法更新构造函数生成的模型值,求错误分析与原因解释

你的购物车OOP代码错误分析与修正

Hey,我来帮你拆解这段JavaScript代码里的问题,顺便理清楚面向对象编程里的常见坑:

核心错误点拆解

1. 每次调用都创建新的购物车实例,数据无法持久化

你的_Cart是一个返回新对象的函数,不管是调用shoppingCart.cart()还是addProducts里的_Cart(),都会生成一个全新的购物车对象。这意味着:

  • 你调用addProducts('product1')时,其实是把产品加到了一个临时创建的购物车里,加完这个对象就被丢弃了
  • 下次调用shoppingCart.cart(),拿到的是另一个全新的空购物车,自然看不到之前添加的产品

打个比方:就像你每次去超市都拿一个新的购物筐,放完东西就扔了,下次再拿新筐,当然是空的。

2. totalPrice的初始类型错误

你把totalPrice初始化成了空对象{},但总价本质是一个数值,应该用0来初始化。如果后续要计算总价(比如totalPrice += product.price),对象和数值相加会得到非预期的结果(比如[object Object]100),完全没法用。

3. 模块模式的使用不符合预期

你想用模块模式封装购物车,但没有维护一个单一的私有实例。模块模式的核心之一是通过闭包保留私有状态,而不是每次调用方法都新建状态。


修正后的代码示例

var shoppingcartModel = function() {
  // 私有购物车实例:只在模块初始化时创建一次
  var _cart = { 
    totalPrice: 0, // 改成数值类型,初始为0
    products: [] 
  };

  return {
    // 返回同一个实例,而非每次新建
    cart: function() { return _cart; },
    addProducts: function(product) {
      _cart.products.push(product);
      // 可选:如果产品有价格,可以在这里同步更新总价
      // if (product?.price) _cart.totalPrice += product.price;
      return _cart.products.length;
    }
  };
};

var shoppingCart = shoppingcartModel();
console.log(shoppingCart.cart()); // 初始状态:{ totalPrice: 0, products: [] }
shoppingCart.addProducts('product1');
shoppingCart.addProducts('product2');
console.log(shoppingCart.cart()); // 现在能看到products: ['product1', 'product2']

修正说明

  • 把原来的_Cart函数替换成了一个直接创建的私有实例_cart,模块内部只初始化一次,所有方法都操作这个实例
  • cart()方法返回这个唯一的实例,所以每次调用都能看到最新的购物车状态
  • 修正了totalPrice的初始类型,符合总价的实际用途
  • 闭包保留了_cart的私有状态,外部无法直接修改,只能通过暴露的addProducts方法操作,符合封装原则

内容的提问来源于stack exchange,提问作者volna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:35:29