Node.js中Car类静态变量validGears未定义错误求助
问题原因
你犯了两个关键错误:
- 静态属性访问方式错误:
validGears是类的静态属性,不属于实例,所以在实例方法changeGear里直接写validGears会被当成未定义的变量。静态属性必须通过类名(Car.validGears)或者实例的构造函数(this.constructor.validGears)来访问。 - switch逻辑错误:你写的
case validGears[newGear]完全不符合逻辑——newGear是字符串(比如"Drive"),用它当数组索引去取validGears里的元素会得到undefined,这个case永远不会被触发。你真正要做的是先检查传入的newGear是否在validGears数组中,再执行换挡操作。
修正后的代码
class Car { constructor(data = {}) { this.color = data.color || "blue"; this.currentSpeed = data.currentSpeed || 0; this.topSpeed = data.topSpeed || 25; this.currentGear = data.currentGear || "Park"; this.maxGas = data.maxGas || 10; // Litres this.currentGas = data.currentGas || this.maxGas; } static validGears = ["Park", "Neutral", "Drive"]; changeGear(newGear) { // 先检查是否已经是当前挡位 if (newGear === this.currentGear) { console.log(`Car is already in ${newGear}`); return; } // 检查挡位是否合法 if (Car.validGears.includes(newGear)) { this.currentGear = newGear; console.log(`Successfully shifted to ${newGear}`); } else { console.log(`Invalid gear. Valid gears are: ${Car.validGears.join(", ")}`); } } } // 测试代码 let newCar = new Car({color: "Magenta", currentSpeed: 15}); newCar.changeGear("Drive"); // 正常切换到Drive挡位 newCar.changeGear("Drive"); // 提示已处于该挡位 newCar.changeGear("Reverse"); // 提示无效挡位
补充说明
如果以后要继承Car类,用this.constructor.validGears代替Car.validGears会更灵活,子类的静态属性会被正确读取,示例:
class ElectricCar extends Car { static validGears = ["Park", "Neutral", "Drive", "Regen"]; } let tesla = new ElectricCar(); tesla.changeGear("Regen"); // 用this.constructor.validGears的话,会识别子类的validGears
内容的提问来源于stack exchange,提问作者QuinnMcChief
相关产品推荐
相关产品推荐

