JS构造函数实例方法实现及push is not a function报错原因解析
错误产生原因
- 触发报错的直接原因:实例化
Car时给utilidad参数传入的是字符串值"city",push()是仅数组对象拥有的方法,字符串不存在该方法,调用时直接触发类型错误。 - 额外的写法问题:当前在构造函数内部用箭头函数定义实例方法的写法不规范,箭头函数没有独立的
this绑定,虽然在当前场景下this刚好指向实例,但无法实现方法的复用,每个实例都会单独创建一份箭头函数,会造成不必要的内存占用,也不符合构造函数方法的标准实现逻辑。
正确实现方案
如果你的需求是utilidad用于存储车辆的多个使用场景,支持追加内容,推荐做两处修正:
- 实例化时传入数组类型的初始
utilidad值,或者在构造函数内部增加参数容错处理,避免传入非数组时直接报错 - 将实例方法挂载到构造函数的原型对象上,所有实例可共享同一份方法逻辑,降低内存消耗
修正后的完整代码如下:
function Car(brand, year, model, color, utilidad) { this.brand = brand; this.year = year; this.model = model; this.color = color; // 增加参数容错,非数组输入默认转为空数组 this.utilidad = Array.isArray(utilidad) ? utilidad : []; } // 实例方法挂载到构造函数原型 Car.prototype.useFor = function(prmt) { this.utilidad.push(prmt); }; // 实例化时传入数组格式的初始值 const toyota = new Car("Toyota", 2021, "Prado", "Red", ["city"]); toyota.useFor('mountain'); console.log(toyota.utilidad); // 输出结果:["city", "mountain"]
如果你的需求是utilidad为字符串类型,仅需要拼接内容,把useFor方法内的逻辑改为字符串拼接即可:
Car.prototype.useFor = function(prmt) { this.utilidad += ` ${prmt}`; };
内容的提问来源于stack exchange,提问作者willicali
相关产品推荐
相关产品推荐

