javascript通过原型链实现属性查找,即先查对象自身,再沿__proto__逐级向上委托至null;构造函数实例的__proto__指向其prototype,支持方法共享与继承;推荐用object.create()或class语法建立委托关系。

当访问一个对象的属性时,如果该对象自身没有这个属性,JavaScript 会沿着它的 原型链 向上查找,直到找到该属性或到达原型链末端(即 null)。这个机制就是“向上委托”的核心。
原型链的起点:对象的 __proto__
每个对象都有一个内部属性 [[Prototype]],通常可通过 __proto__ 访问(不推荐直接使用,但便于理解)。它指向该对象的原型对象。例如:
const obj = {};
console.log(obj.__proto__ === Object.prototype); // true
这个 Object.prototype 自身也有 __proto__,值为 null,标志着原型链终点。
属性查找过程:从自身到原型逐级回溯
引擎执行属性访问(如 obj.prop)时,按以下顺序查找:
- 先检查
obj自身是否拥有该属性(包括自有属性和可枚举/不可枚举属性) - 如果没有,就去
obj.__proto__对象上查找 - 若仍没找到,继续查
obj.__proto__.__proto__,依此类推 - 直到某个原型对象包含该属性,或最终抵达
null(此时返回undefined)
构造函数与 prototype 的作用
用构造函数创建实例时,实例的 __proto__ 会自动指向构造函数的 prototype 属性:
function Person(name) { this.name = name; }
Person.prototype.say = function() { return 'Hello'; };
const p = new Person('Alice');
console.log(p.say()); // 'Hello' —— p 自身无 say,委托给 Person.prototype
这种设计让多个实例共享方法,节省内存,也构成了典型的委托链:p → Person.prototype → Object.prototype → null。
手动设置原型实现委托(现代写法)
推荐使用 Object.create() 或 class 语法明确建立原型关系:
-
const child = Object.create(parent):child.__proto__指向parent -
class B extends A:B 的原型链包含 A.prototype,支持方法继承和 super 调用 -
Object.setPrototypeOf(obj, proto)可动态修改原型(慎用,影响性能)
只要原型链存在,属性或方法缺失时就会自然向上委托,无需额外代码干预。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











