类体定义的函数应自动挂载原型,为何调用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
相关产品推荐
相关产品推荐

