JavaScript OOP中动态设置对象键名及方法内访问的问题
解决Inventory构造函数动态键名问题
直接在构造函数中使用方括号语法结合this,就能实现根据参数动态设置键名,同时保证后续可以正常访问该键的内部属性。
正确实现代码
function Inventory(item, price, quantity) { // 方括号语法会把item变量的值作为键名绑定到实例 this[item] = { price: price, quantity: quantity }; }
使用示例
// 创建苹果库存实例,键名为"apple" const appleStock = new Inventory('apple', 1.99, 50); console.log(appleStock.apple.price); // 输出 1.99 console.log(appleStock.apple.quantity); // 输出 50 // 创建香蕉库存实例,键名为"banana" const bananaStock = new Inventory('banana', 0.99, 100); console.log(bananaStock.banana.price); // 输出 0.99
为什么之前的方法不行?
- 用
this.item时,JavaScript会将item识别为字符串字面量,而非变量,因此键名固定为"item",不会随参数变化。 - 你之前尝试的
newObj[item]确实能动态设置键名,但newObj是构造函数内部的局部对象,没有挂载到实例(this)上,所以外部无法访问它的属性。只要把动态键直接绑定到this,就能解决访问问题。
动态访问键名的场景
如果后续不知道具体键名,可通过变量或遍历的方式访问:
const orangeStock = new Inventory('orange', 2.49, 30); const itemKey = 'orange'; // 通过变量访问 console.log(orangeStock[itemKey].quantity); // 输出 30 // 遍历实例的所有动态键 for (const key in orangeStock) { console.log(`商品:${key},单价:${orangeStock[key].price},库存:${orangeStock[key].quantity}`); }
内容的提问来源于stack exchange,提问作者Michael Shand
相关产品推荐
相关产品推荐

