__proto__是非标准但广泛支持的属性,指向对象隐式原型(构造函数的prototype);可手动遍历原型链,但应优先使用object.getprototypeof()和object.setprototypeof()。

JavaScript 中 __proto__ 是对象的一个**非标准但被广泛支持的属性**,它指向该对象的隐式原型(即构造函数的 prototype 对象)。通过它,你可以手动查看或遍历原型链,理解属性和方法的查找路径。
如何用 __proto__ 查看当前对象的隐式原型
每个普通对象(除 null)都有 __proto__ 属性,它的值就是其构造函数的 prototype:
-
const obj = {};→obj.__proto__ === Object.prototype -
const arr = [];→arr.__proto__ === Array.prototype -
function Foo() {};const f = new Foo();→f.__proto__ === Foo.prototype
用 __proto__ 手动遍历原型链
属性访问(如 obj.x)本质上是沿着 __proto__ 链向上查找。你可以用它模拟这个过程:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
- 先检查自身:
obj.hasOwnProperty('x') - 再查隐式原型:
obj.__proto__.hasOwnProperty('x') - 继续向上:
obj.__proto__.__proto__(即Object.prototype) - 最终到
null:所有原型链终点都是Object.prototype.__proto__ === null
注意:这不是推荐的生产写法
__proto__ 是历史遗留属性,已被 Object.getPrototypeOf() 和 Object.setPrototypeOf() 取代:
- ✅ 推荐获取原型:
Object.getPrototypeOf(obj)(等价于obj.__proto__,但标准、安全) - ❌ 避免直接赋值:
obj.__proto__ = otherProto易导致性能问题,应改用Object.setPrototypeOf(obj, otherProto) - ⚠️ 不能用于字面量
null:null.__proto__报错,而Object.getPrototypeOf(null)也会报错,符合规范
小技巧:快速打印原型链
在控制台中可以这样观察链路:
let obj = { a: 1 };
console.log(obj.__proto__); // Object.prototype
console.log(obj.__proto__.__proto__); // null
或者更清晰地:
let arr = [1, 2]; console.log(arr.__proto__ === Array.prototype); // true console.log(arr.__proto__.__proto__ === Object.prototype); // true console.log(arr.__proto__.__proto__.__proto__); // null
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










