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

类体定义的函数应自动挂载原型,为何调用obj.__proto__.drive报错?

问题原因分析

你的问题核心是混淆了类中两种函数定义方式的差异,导致对原型挂载的理解出现偏差:

1. 你写的drive = function(){...}是什么?

这种写法是ES6+的类字段语法,它的作用是在实例创建时,直接把函数赋值给当前实例(也就是this)的drive属性。换句话说:

  • 每个Car实例都会拥有属于自己的独立drive函数副本
  • 这个函数根本不会出现在Car.prototype(也就是obj.__proto__指向的对象)上

所以你执行obj.__proto__.drive()时,自然会找不到这个方法,抛出TypeError。

2. 真正挂载到原型的写法是怎样的?

如果要让函数挂载到原型对象上,需要使用类的原型方法语法,也就是去掉赋值操作,直接写函数声明:

class Car {
  constructor(name, year) {
    this.name = name;
    this.year = year;
  }

  // 这种写法才会被挂载到Car.prototype上
  drive() {
    console.log("driving");
  }
}

const obj = new Car("toyota", "1996");
obj.__proto__.drive(); // 此时正常输出 "driving"

3. 两种写法的本质差异对比

写法类型挂载位置实例是否共享函数等价代码(构造函数内)
类字段函数实例对象(this)不共享,每个实例独立constructor里写 this.drive = function(){...}
类原型方法类的原型对象(Car.prototype)所有实例共享Car.prototype.drive = function(){...}

验证一下

你可以在原代码里加两行验证:

console.log(obj.hasOwnProperty('drive')); // 输出 true,说明drive是实例自己的属性
console.log(Car.prototype.drive); // 输出 undefined,原型上确实没有这个方法

如果改成原型方法写法,上面两行的结果会变成false和对应的函数体。

内容的提问来源于stack exchange,提问作者JethroT

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:22:09