箭头函数不能用于原型方法定义,因其无this和super绑定,会破坏继承机制;应使用普通函数定义原型方法以确保可继承性和super调用正常。

关键在于:箭头函数没有自己的 this 和 super,它会沿词法作用域向上查找,而不是按运行时实例的原型链动态绑定。这直接破坏了继承机制中对父类方法和上下文的预期行为。
不要在原型方法定义中使用箭头函数
类的方法默认挂载在原型上(即 MyClass.prototype.method),这是继承复用的基础。若写成箭头函数形式:
- 它会被当作实例属性初始化(每次构造都新建),无法被子类原型继承
- 没有
super绑定,子类中调用super.method()会报错或静默失败 -
this指向定义时外层作用域(通常是模块顶层或构造函数内部),而非当前实例
区分实例方法与原型方法的写法
明确哪些该放原型、哪些该放实例:
- ✅ 正确(原型方法,可被继承):
method() { console.log(this.name); } - ❌ 错误(实例属性,不可继承):
method = () => console.log(this.name); - ⚠️ 特殊场景可用(但需主动绕过 super):若必须用箭头函数保持 this,应在子类中手动保存父类方法引用,再调用,例如:
private superHandle = this.handle; handle = () => this.superHandle();
继承时避免在子类中覆盖为箭头函数
即使父类方法是普通函数,子类重写时也别改用箭头函数:
- 子类箭头函数无法通过
super.xxx()调用父实现 - 子类实例调用该方法时,
this不指向自身,可能访问不到本该存在的属性 - instanceof 和方法查找链会断裂,调试时难以追踪行为来源
需要稳定 this 时,优先用 bind 或事件处理器规范写法
常见需求如事件回调、定时器中保持 this,有更安全的替代方案:
- 构造函数中绑定:
this.handleClick = this.handleClick.bind(this); - 使用普通函数 + 显式传参:
element.addEventListener('click', (e) => this.handleClick(e));(注意:这里箭头函数仅作包装,实际逻辑仍在普通方法里) - React/Vue 等框架中,依赖生命周期清理机制解绑,避免闭包持有大对象











