__proto__ 是对象内部属性,指向其构造函数的 prototype 对象,用于原型链查找,但非标准 api;应使用 object.getprototypeof()、object.setprototypeof() 和 object.create() 等标准化方法替代。

JavaScript 中 __proto__ 是对象内部属性,指向其构造函数的 prototype 对象,用于构建原型链。但它不是标准 API,不应用于生产环境;真正可靠的是 Object.getPrototypeOf() 和 Object.setPrototypeOf()。
__proto__ 的本质与作用
__proto__ 是每个对象(除 null)都有的隐式属性,它决定了该对象在属性查找时向上委托的下一个对象。比如:
- 当访问
obj.x且obj自身没有x时,JS 引擎会顺着obj.__proto__查找; - 若仍没找到,继续查
obj.__proto__.__proto__,直到为null终止; - 这个“逐级向上”的过程就是原型链查找机制的核心。
深度原型链的形成方式
所谓“深度”,是指原型链层级较多,例如 A → B → C → Object.prototype → null。实现方式有几种:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 通过构造函数:让 B.prototype = Object.create(A.prototype),再让 C.prototype = Object.create(B.prototype);
- 直接赋值 __proto__(不推荐):如
c.__proto__ = b; b.__proto__ = a;; - 使用
Object.setPrototypeOf(c, b)更安全,它会校验参数类型并避免意外污染。
__proto__ 的局限与风险
__proto__ 是历史遗留属性,ECMAScript 规范中已将其列为“可选支持”,现代引擎虽仍保留,但存在明显问题:
- 性能差:修改 __proto__ 可能导致 JS 引擎放弃对对象的优化(如隐藏类失效);
- 不可枚举:它不会出现在
for...in或Object.keys()中,但会影响原型链行为; - 易出错:直接操作可能绕过正常继承逻辑,尤其在 class 语法下容易破坏
super行为。
替代方案与最佳实践
要安全地构建或操作原型链,应优先使用标准化方法:
- 获取原型:
Object.getPrototypeOf(obj)—— 稳定、跨平台、无副作用; - 设置原型:
Object.setPrototypeOf(obj, proto)—— 明确意图,且会在严格模式下报错(防止误用); - 创建带指定原型的对象:
Object.create(proto, descriptors)—— 最适合初始化阶段构建深度链。
不复杂但容易忽略。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










