javascript原型链查找是沿__proto__逐级向上搜索属性,直至找到或到达null;受自有属性和可枚举性影响,但查找本身不区分可枚举性;同名实例属性会屏蔽原型属性。

JavaScript 中通过原型链查找上层属性,本质是沿着对象的 __proto__(或构造函数的 prototype)一级级向上搜索,直到找到该属性,或到达原型链末端(null)为止。
原型链查找的基本路径
当你访问一个对象的属性(如 obj.name),JS 引擎会按以下顺序查找:
- 先检查对象自身是否拥有该属性(
Object.hasOwn(obj, 'name')或'name' in obj判断范围不同) - 如果没有,就去
obj.__proto__(即obj.constructor.prototype)中查找 - 如果还没找到,继续查
obj.__proto__.__proto__,依此类推 - 最终到达
Object.prototype.__proto__ === null,停止查找,返回undefined
手动验证原型链结构
可以用 Object.getPrototypeOf() 安全地获取原型,避免直接操作 __proto__:
const arr = [1, 2]; console.log(Object.getPrototypeOf(arr) === Array.prototype); // true console.log(Object.getPrototypeOf(Array.prototype) === Object.prototype); // true console.log(Object.getPrototypeOf(Object.prototype)); // null
这样就能清晰看到:数组实例 → Array.prototype → Object.prototype → null。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
属性查找受“自有属性”和“可枚举性”影响
原型链查找不区分属性是否可枚举,只要存在就会被访问到。但 for...in 只遍历**可枚举**的自有 + 继承属性;Object.keys() 只返回自有且可枚举的属性。
例如:
function Foo() {}
Foo.prototype.x = 1;
Foo.prototype.y = 2;
Object.defineProperty(Foo.prototype, 'z', { value: 3, enumerable: false });
const f = new Foo();
console.log(f.x); // 1 ← 正常查到(即使 z 不可枚举,x 仍能访问)
console.log('z' in f); // true ← in 操作符也会查原型链,不管是否可枚举
console.log(Object.keys(f)); // [] ← 自有属性为空
console.log(Object.keys(Foo.prototype)); // ['x', 'y'] ← z 不可枚举,不出现
注意覆盖与屏蔽(Shadowing)
如果在实例上设置同名属性,会**屏蔽**原型上的同名属性,后续访问都优先取实例值,不会继续向上找:
function Dog() {}
Dog.prototype.bark = function() { return 'woof'; };
const d = new Dog();
console.log(d.bark()); // 'woof'
d.bark = function() { return 'yelp'; }; // 实例上定义 bark
console.log(d.bark()); // 'yelp' ← 原型上的 bark 被屏蔽,不再调用
console.log(Dog.prototype.bark()); // 'woof' ← 原型方法本身未改变
要恢复调用原型方法,可用 delete d.bark 删除自有属性,或显式调用 Dog.prototype.bark.call(d)。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










