__proto__ 是对象的隐式原型属性,指向其构造函数的 prototype,用于读取原型链(如 obj.__proto__ === obj.constructor.prototype),但应避免写入,推荐用 object.getprototypeof() 替代。

__proto__ 是 JavaScript 中每个对象都有的一个内部属性(现已标准化为 Object.getPrototypeOf(obj) 的等价访问方式),它指向该对象的隐式原型(即构造函数的 prototype 对象)。它不是用于“设置”原型链的推荐方式,但在调试、学习原型继承机制时,确实能快速查看对象的原型链走向。
用 __proto__ 逐级查看原型链
对象的 __proto__ 指向其直接原型。你可以连续访问 __proto__,一层层向上追溯,直到到达 null(原型链终点):
- 普通对象:`{}` →
Object.prototype→null - 数组:`[]` →
Array.prototype→Object.prototype→null - 函数:`function f(){}` →
Function.prototype→Object.prototype→null
例如在控制台中输入:
const arr = [];<br>arr.__proto__ === Array.prototype // true<br>arr.__proto__.__proto__ === Object.prototype // true<br>arr.__proto__.__proto__.__proto__ === null // true
对比 constructor.prototype 理解关联性
对于由构造函数创建的实例,__proto__ 通常等于其构造函数的 prototype 属性:
-
const obj = new Date(); obj.__proto__ === Date.prototype→ true -
const fn = function(){}; fn.__proto__ === Function.prototype→ true
注意:箭头函数没有自己的 prototype,也不能作为构造函数,所以它的 __proto__ 直接指向 Function.prototype,但 fn.prototype 是 undefined。
用 console.dir() 辅助可视化
单独打印 __proto__ 只显示对象引用,不易看清结构。更直观的方式是:console.dir(obj) —— 浏览器开发者工具会以可展开树形结构展示对象及其 __proto__ 链。
你还能在右侧“Prototype”或“[[Prototype]]”节点下,清晰看到每一层的属性和方法来源。
注意兼容性与现代替代写法
__proto__ 虽被广泛支持,但属于遗留特性,ECMAScript 规范已将其标记为“仅用于浏览器兼容”,不建议在生产代码中赋值使用(如 obj.__proto__ = newProto):
- ✅ 安全读取:
obj.__proto__或Object.getPrototypeOf(obj) - ✅ 推荐替代:
Object.getPrototypeOf(obj)更语义化、可被静态分析 - ❌ 避免写入:
obj.__proto__ = ...会影响性能且不可靠
若需创建指定原型的对象,优先用 Object.create(proto);若需修改已有对象的原型(极少见),用 Object.setPrototypeOf(obj, proto)(但仍应避免)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











