如何创建带属性的新产品?通过addProduct函数构造带属性product对象
正确实现addProduct添加产品功能的方案
先说说你现有代码里的几个问题,咱们一步步修正:
- 参数传递与接收不匹配:你调用
addProduct时传了3个参数("dog", 1488, 2000),但函数只定义了一个newProduct参数,后两个值根本没被接收到。 - 错误使用
new关键字:addProduct是用来执行添加操作的普通函数,不是构造函数,用new调用会创建一个空的实例对象,完全不符合你的需求。 - 函数内部逻辑错误:你在函数里重新声明了
var newProduct = this.product;,这里的this在new调用时指向新创建的实例,而实例上根本没有product属性,同时还覆盖了传入的参数,等于完全没用到传入的产品数据。
方案1:接收独立参数的基础实现
这种方式适合参数固定的场景,调用起来直接明了:
// 现有存储数组 var storage = [ {product: {name: "cat", count: 3443, price: 1000}} ]; // 定义addProduct函数,接收名称、数量、价格三个参数 function addProduct(name, count, price) { // 创建符合storage格式的产品条目 const newProductItem = { product: { name: name, count: count, price: price } }; // 将新条目添加到storage数组 storage.push(newProductItem); } // 调用函数添加新产品 addProduct("dog", 1488, 2000); // 验证结果(可以打印看看) console.log(storage); // 输出会包含两个条目:cat和dog的产品信息
方案2:接收属性对象的灵活实现
如果后续可能扩展产品属性(比如分类、产地等),推荐用这种方式,扩展性更强:
var storage = [ {product: {name: "cat", count: 3443, price: 1000}} ]; // 接收一个包含产品属性的对象作为参数 function addProduct(productProps) { // 解构参数,提取需要的属性(可以加默认值避免参数缺失报错) const { name, count, price } = productProps; // 创建产品条目 const newProductItem = { product: { name, count, price // 后续加新属性直接在这里扩展即可 } }; storage.push(newProductItem); } // 调用方式:传入属性对象 addProduct({ name: "dog", count: 1488, price: 2000 }); // 后续扩展属性示例 addProduct({ name: "fish", count: 5000, price: 500, category: "pet" });
额外优化建议
- 可以给参数加默认值,避免调用时漏传参数导致属性为
undefined,比如:function addProduct(name = "unknown", count = 0, price = 0) { // ...逻辑不变 } - 如果用ES6+语法,建议把
var换成const/let,避免变量提升带来的问题。
内容的提问来源于stack exchange,提问作者Igor Shvets
相关产品推荐
相关产品推荐

