JavaScript原型链由__proto__自动连接,实例→构造函数prototype→父类prototype→Object.prototype→null;new时实例__proto__指向构造函数prototype,函数有prototype属性而对象只有__proto__,链终止于null确保属性查找安全结束。

JavaScript 中原型链靠 __proto__ 一层层向上连接,形成从实例 → 子类原型 → 父类原型 → Object.prototype → null 的查找路径。它不是靠代码“手动串联”,而是由引擎在对象创建时自动设置的隐式链接。
__proto__ 是怎么被自动设置的
每次用 new 调用构造函数时,新生成的实例对象会自动把自身的 __proto__ 指向该构造函数的 prototype 对象。
-
const obj = new Foo()→obj.__proto__ === Foo.prototype -
const dog = new Dog()→dog.__proto__ === Dog.prototype - 而如果
Dog.prototype = new Animal(),那Dog.prototype.__proto__ === Animal.prototype
多层继承的链条长什么样
假设你有三层:Person → Student → GraduateStudent,原型链就是:
-
grad.__proto__→GraduateStudent.prototype -
GraduateStudent.prototype.__proto__→Student.prototype -
Student.prototype.__proto__→Person.prototype -
Person.prototype.__proto__→Object.prototype -
Object.prototype.__proto__→null(终点)
访问 grad.getName() 时,JS 就按这个顺序逐层查找,直到找到或到 null 为止。
立即学习“Java免费学习笔记(深入)”;
关键细节不能漏
__proto__ 是每个对象都有的内部链接,但只有函数才有 prototype 属性。普通对象(如 {} 或数组)没有 prototype,但仍有 __proto__,指向其构造器的原型(比如 [].__proto__ === Array.prototype)。
- 不要混淆
__proto__(实例身上的)和prototype(函数身上的) - 修改
__proto__不推荐,应优先用Object.setPrototypeOf()或Object.create() -
Object.getPrototypeOf(obj)是读取__proto__的标准方式,比直接访问更安全
为什么链必须终止于 null
因为 JS 查找属性时,一旦到达 null 还没找到,就返回 undefined。如果不停止,就会无限循环或出错。所有原型链最终都通向 Object.prototype,而它的 __proto__ 明确定义为 null,这是整个机制能稳定工作的锚点。


















