对象字面量中方法的 this 指向调用者而非定义位置;obj.method() 调用时 this 为 obj,赋值后独立调用则 this 丢失;箭头函数无自身 this,继承外层作用域;对象字面量方法不适用 new 调用。

函数执行上下文决定 this 的值,而对象字面量方法的 this 指向,关键看它**怎么被调用**,不是怎么被定义的。
对象字面量中方法的 this 默认指向调用者
当一个函数作为对象的属性(即方法)被点号或方括号调用时,this 就绑定到该对象。
- 例如:const user = { name: 'Tom', say() { console.log(this.name) } }; user.say() → 输出 'Tom',因为 this 指向 user
- 即使函数写在对象内部,只要调用形式是 obj.method(),this 就是 obj
- 注意:this 不是“属于”这个对象字面量本身,而是由调用时的执行上下文动态决定的
赋值后独立调用,this 会丢失并指向全局或 undefined
把对象里的方法取出来单独调用,就脱离了原对象上下文,变成普通函数调用。
- 例如:const fn = user.say; fn() → 非严格模式下 this 是 window,严格模式下是 undefined
- 此时不再有“上一级对象”,执行上下文切换为全局,this 绑定规则回归默认行为
- 这和对象字面量的结构无关,只和调用方式有关
箭头函数在对象字面量里不改变 this 绑定逻辑
箭头函数没有自己的 this,它直接继承外层作用域的 this 值。
- 如果箭头函数写在对象字面量顶层(如 const obj = { fn: () => console.log(this) }),它的 this 来自全局上下文(通常是 window 或 undefined)
- 如果写在普通方法内部,则继承那个方法的 this,比如:say() { const inner = () => console.log(this.name); inner(); } → inner 的 this 和 say 一致
- 所以不能靠“放在对象里”让箭头函数自动指向该对象
构造函数与 new 调用不适用于对象字面量方法
对象字面量本身不是构造函数,其中的方法也不会因 new 调用而改变 this 指向。
- 像 const obj = { init() { this.x = 1 } }; new obj.init() 这种写法虽然语法合法,但不符合设计意图;this 会指向新实例,但 obj.init 并未按构造函数方式编写,容易出错
- 真正需要构造实例,应使用 function 或 class 定义,而非依赖对象字面量里的方法
- 对象字面量适合描述数据+行为组合,不适合替代构造器语义

















