__proto__ 是每个对象(除 null 和部分原始包装对象外)的内部属性,指向其构造函数的 prototype 对象,构成隐式原型链;属性查找先在自身找,再沿 __proto__ 向上直至 null。

JavaScript 中对象通过 __proto__ 访问原型链上的属性,本质是沿着隐式原型链向上查找,直到找到该属性或到达 null。
__proto__ 是什么
__proto__ 是每个对象(除 null 和部分原始包装对象外)都有的内部属性,指向其构造函数的 prototype 对象。它构成了对象的隐式原型链。
例如:
const obj = {};
console.log(obj.__proto__ === Object.prototype); // true
console.log(obj.toString); // ƒ toString() { ... } —— 来自 Object.prototype
属性查找过程
当访问对象的某个属性时,JS 引擎按以下顺序查找:
- 先在对象自身属性中查找(
hasOwnProperty为 true 的) - 没找到则顺着
__proto__指向的原型对象继续查找 - 重复该过程,直到找到属性,或
__proto__为null(即到达原型链顶端)
比如:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
function Animal(name) { this.name = name; }
Animal.prototype.speak = function() { return 'I am ' + this.name; };
const dog = new Animal('Dog');
console.log(dog.speak()); // 'I am Dog' —— 自身没有 speak,从 dog.__proto__(即 Animal.prototype)找到
注意 __proto__ 的使用场景和限制
__proto__ 是非标准但被广泛支持的遗留属性,现代代码推荐用标准 API 替代:
- 获取原型:用
Object.getPrototypeOf(obj)(比obj.__proto__更规范) - 设置原型:用
Object.setPrototypeOf(obj, proto)(__proto__赋值有性能隐患且不推荐) - 判断继承关系:用
obj instanceof Constructor或Constructor.prototype.isPrototypeOf(obj)
直接修改 __proto__ 可能导致 V8 等引擎放弃对对象的优化,应避免在生产环境使用。
原型链不是无限循环
所有普通对象最终都指向 Object.prototype,而它的 __proto__ 是 null:
console.log(Object.prototype.__proto__); // null
这是原型链的终点。任何属性查找到这里还没找到,就返回 undefined。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










