对象方法简写与传统匿名函数属性的this行为完全一致,均遵循动态绑定规则:调用时由谁调用就指向谁,且都可被call/apply/bind修改;而箭头函数是词法绑定,this继承外层作用域。

对象方法简写(如 say() { })和传统匿名函数属性(如 say: function() { })在 this 指向上完全一致——它们都遵循动态绑定规则,调用时由谁调用就指向谁。
两者 this 行为相同的核心原因
它们都属于「普通函数」,不是箭头函数,因此:
- 内部都有独立的执行上下文,
this在调用时才确定 - 作为对象方法被调用时(
obj.say()),this指向该对象 - 被赋值给变量后单独调用(
const f = obj.say; f();),this指向全局对象(非严格模式)或undefined(严格模式) - 均可被
call、apply、bind显式修改this
真正容易混淆的对比对象是箭头函数
很多人误以为方法简写和匿名函数有差异,其实是把它们和箭头函数(say: () => { })搞混了。箭头函数的 this 是词法绑定的:
- 它不关心怎么调用,只继承定义时外层作用域的
this - 在对象字面量中直接写箭头函数,外层没有明确的
this绑定上下文,所以this通常指向全局或undefined - 无法通过
call/apply改变其this
快速识别技巧:看函数体内有没有 this 依赖
如果一段代码依赖 this 访问当前对象属性,应避免使用箭头函数;而方法简写和匿名函数属性可互换使用:
- ✅
getInfo() { return this.name; }—— 安全,this指向调用它的对象 - ✅
getInfo: function() { return this.name; }—— 行为完全一样 - ❌
getInfo: () => this.name——this不指向对象,大概率出错
补充:枚举性与构造能力不影响 this
虽然方法简写在类中定义在原型上、不可枚举,而对象字面量中二者默认可枚举,但这些特性不改变 this 绑定逻辑。同样,二者都不能用 new 调用,但这和 this 指向无关,只说明它们没有 [[Construct]] 内部方法。











