原型查找决定属性来源,隐式绑定决定this指向;前者沿__proto__向上搜索,后者取决于调用时点号左侧对象;二者独立运作但常共存于obj.method()场景。

JavaScript 中原型属性的查找和 this 的隐式绑定是两个独立但常被混淆的概念。原型查找解决“属性从哪来”,而隐式绑定决定“this 指向谁”。两者都依赖调用时的上下文,但机制不同、触发条件也不同。
原型链属性查找:沿着 __proto__ 向上找
当访问一个对象的属性时,JS 引擎先在该对象自身查找;没找到就顺着 [[Prototype]](通常通过 __proto__ 访问)向上查找,直到原型为 null 为止。
- 所有普通对象的顶层原型是
Object.prototype,它的__proto__是null - 函数对象的原型默认是
Function.prototype,它也继承自Object.prototype - 数组、日期等内置类型同理,各自有对应的原型(如
Array.prototype),最终都连到Object.prototype - 修改原型上的方法(如给
Array.prototype.push赋新值)会影响所有实例,因为查找路径没变
隐式绑定:谁调用,this 就指向谁
函数以「对象方法」形式被调用时(即 obj.method()),this 自动绑定为该对象。这个规则不关心方法定义在哪,只看调用时的点号左侧是谁。
-
const obj = { name: 'a', fn() { console.log(this.name); } }; obj.fn();→ 输出'a',因为obj是调用者 - 如果把方法提取出来:
const f = obj.fn; f();→this指向undefined(严格模式)或全局对象(非严格),不再是obj - 即使方法来自原型:
const child = Object.create({ say() { return this.name; } }); child.name = 'b'; child.say();→this仍是child,因为调用者是child
两者交汇的典型场景
当一个方法存在于原型上,又被对象调用时,原型查找和隐式绑定同时发生:
- 查找阶段:JS 先在
obj上没找到method,再沿obj.__proto__找到它 - 绑定阶段:由于调用形式是
obj.method(),所以this绑定为obj,而非原型对象 - 注意:
this不会因为方法定义在原型上就指向原型;它只认调用者本身
容易踩坑的地方
常见误解是认为“方法在哪定义,this 就指向哪”。实际上:
- 箭头函数没有自己的
this,它继承外层函数作用域的this,不受隐式绑定影响 - 使用
call/apply/bind会显式覆盖隐式绑定 - 事件回调中,如
btn.addEventListener('click', obj.handler),this默认指向btn,不是obj,除非手动绑定 - 类方法中未绑定,放进定时器或事件里就会丢失
this,需用bind、箭头函数或属性初始化语法修复
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











