You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JS构造函数实例方法实现及push is not a function报错原因解析

错误产生原因
  • 触发报错的直接原因:实例化Car时给utilidad参数传入的是字符串值"city",push()是仅数组对象拥有的方法,字符串不存在该方法,调用时直接触发类型错误。
  • 额外的写法问题:当前在构造函数内部用箭头函数定义实例方法的写法不规范,箭头函数没有独立的this绑定,虽然在当前场景下this刚好指向实例,但无法实现方法的复用,每个实例都会单独创建一份箭头函数,会造成不必要的内存占用,也不符合构造函数方法的标准实现逻辑。
正确实现方案

如果你的需求是utilidad用于存储车辆的多个使用场景,支持追加内容,推荐做两处修正:

  1. 实例化时传入数组类型的初始utilidad值,或者在构造函数内部增加参数容错处理,避免传入非数组时直接报错
  2. 将实例方法挂载到构造函数的原型对象上,所有实例可共享同一份方法逻辑,降低内存消耗

修正后的完整代码如下:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 03:15:06