this指向调用者本身,而非定义位置;obj.method()中this恒为obj,原型链查找不改变this绑定;单独调用会丢失this,需bind或箭头函数修复;原型上禁用箭头函数;new调用时this为新实例。

原型方法里的 this 指向谁,只看“谁在调用它”,而不是“它写在哪”。哪怕方法定义在原型上,只要你是用 obj.method() 这种方式调用的,this 就一定是 obj 本身。
原型链查找不影响 this 绑定
JavaScript 引擎沿着原型链找到方法后,执行时的 this 仍是最初那个点号前面的对象。它不会因为方法来自 obj.__proto__ 或 Object.prototype 就变成原型对象。
-
const obj = Object.create({ say() { console.log(this); } }); obj.say();→ this 是 obj,不是原型对象 -
Array.prototype.push.call(arr, item)→ 这里用了显式绑定,this 是 arr,和 Array.prototype 无关 - 即使
obj自身没有该方法,只要调用形式是obj.xxx(),this 就锁定为obj
赋值后调用会丢失 this
一旦把原型方法取出来单独调用,就脱离了对象上下文,this 不再指向原对象。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
const fn = obj.toString; fn();→ this 是undefined(严格模式)或window(非严格) -
document.addEventListener('click', obj.handleClick);→ 如果handleClick是原型方法,这里也是单独调用,this 会出错 - 解决办法:用
bind、箭头函数包装,或改用obj.handleClick.bind(obj)
箭头函数在原型中要特别小心
箭头函数不绑定自己的 this,它直接继承外层作用域的 this 值——而这个外层往往不是实例对象。
-
class C { constructor() { this.name = 'c'; } getArrow = () => this.name; }→ 这样写可以,因为箭头函数定义在构造函数内,this 继承的是实例 -
Object.prototype.logName = () => console.log(this.name);→ 错误!箭头函数外层是全局,this 不是调用者,而是全局对象 - 原型上的方法,建议统一用普通函数,避免箭头函数引入意外词法绑定
构造函数和 new 调用是例外场景
如果原型方法被 new 调用(比如作为构造函数),this 指向新创建的实例,和原型链无关。
-
function F() {} F.prototype.run = function() { console.log(this); }; new F().run();→ this 是新实例,不是F.prototype - 注意:这种用法少见,但说明 this 最终仍由调用方式决定,不是由“是否在原型上”决定
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










