__proto__是每个对象(除null)的内部属性,指向其构造函数的prototype对象,构成原型链的查找链接;它使对象能沿链向上查找属性或方法,最终止于Object.prototype.__proto__ === null。

JavaScript 中的原型链通过 __proto__ 实现属性与方法的继承查找,本质是**对象在访问一个属性或方法时,若自身不存在,就沿着 __proto__ 链向上逐级查找,直到找到或到达 null 为止**。
__proto__ 是什么
__proto__ 是每个对象(除 null)都有的内部属性,指向其构造函数的 prototype 对象。它构成了原型链的“链接”:
- 普通对象的
__proto__指向Object.prototype - 数组对象的
__proto__指向Array.prototype - 函数对象的
__proto__指向Function.prototype - 所有原型链最终终点是
Object.prototype.__proto__ === null
属性查找过程:从实例到原型链顶端
当你写 obj.method() 或 obj.prop 时,JS 引擎按以下顺序查找:
- 先检查
obj自身是否拥有该属性(hasOwnProperty为true) - 如果没有,就去
obj.__proto__上找 - 还没找到,就继续查
obj.__proto__.__proto__ - 如此反复,直到某一级有该属性,或
__proto__为null(查找失败,返回undefined)
例如:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
let arr = [1, 2];console.log(arr.map); // 找到了!arr.__proto__ 是 Array.prototype,map 在那里定义
console.log(arr.toString); // 没在 Array.prototype 找到,继续查 Array.prototype.__proto__(即 Object.prototype),toString 在那里
__proto__ 与 prototype 的关系
二者常被混淆,但职责不同:
-
Function.prototype:函数对象的prototype属性,是**用new创建实例时,实例的__proto__所指向的对象** -
obj.__proto__:实例对象的内部链接,指向它的“原型”(通常是构造函数的prototype) -
F.prototype是设计给new F()用的;obj.__proto__是运行时实际走的链
所以:new Foo().__proto__ === Foo.prototype 是成立的,这是原型链能连通的关键。
注意点和现代替代方案
__proto__ 是非标准但被广泛支持的访问方式,存在性能与可维护性隐患:
- 不推荐在生产代码中直接读写
__proto__(如obj.__proto__ = ...) - 应优先使用标准 API:
Object.getPrototypeOf(obj)和Object.setPrototypeOf(obj, proto) - 创建新对象时,用
Object.create(proto)显式指定原型更清晰 - ES6 后,类语法(
class)底层仍靠__proto__链工作,只是封装了细节

















