无法更新构造函数生成的模型值,求错误分析与原因解释
你的购物车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
相关产品推荐
相关产品推荐

