JavaScript原型链是对象属性查找的单向向上路径,由实例的__proto__指向构造函数的prototype构成,终点为Object.prototype.__proto__ === null。

JavaScript 原型是每个函数(包括构造函数)自动拥有的一个对象,叫 prototype;而每个由该函数创建的实例对象,内部都有一个隐式链接(非标准但普遍支持的 __proto__),指向其构造函数的 prototype。这个链接关系层层向上延伸,就构成了原型链——它是 JavaScript 实现继承和属性查找的核心机制。
原型对象(prototype)是构造函数的“共享属性仓库”
当你定义一个函数,比如 function Person(name) { this.name = name; },JS 引擎会自动为它添加一个 Person.prototype 对象。你可以在上面挂载方法或属性,所有通过 new Person() 创建的实例都能访问到它们,且不重复占用内存。
Person.prototype.sayHello = function() { console.log('Hi, ' + this.name); };-
const p1 = new Person('Alice');和const p2 = new Person('Bob');都能调用p1.sayHello(),因为它们的__proto__指向Person.prototype - 注意:
prototype只属于函数,普通对象(如{})没有prototype属性,但有__proto__
__proto__ 是实例对象通往原型的“隐式通道”
每个对象(除 null)都有一个内部属性 [[Prototype]],在大多数引擎中可通过 __proto__ 访问。它决定了当读取一个属性时,如果对象自身没有,就会沿着它往上找——先查 __proto__ 指向的对象,再查那个对象的 __proto__,直到为 null 为止。
-
const obj = {};→obj.__proto__ === Object.prototype -
Object.prototype.__proto__ === null,这是原型链的终点 - 数组
[1,2]的__proto__指向Array.prototype,而Array.prototype.__proto__又指向Object.prototype
原型链的本质是属性查找路径,不是类式继承
JavaScript 没有“类继承”的底层机制,只有对象间委托(delegation)。所谓“继承”,其实是子对象通过 __proto__ 委托父对象处理属性和方法调用。ES6 的 class 只是语法糖,背后仍是原型链。
立即学习“Java免费学习笔记(深入)”;
- 用
Object.create(Parent.prototype)手动设置子构造函数的原型,可实现继承 - 现代写法推荐使用
extends和super(),但执行时仍会把子类实例的__proto__连到父类原型上 - 判断关系用
instanceof(检查原型链中是否包含某构造函数的prototype)或isPrototypeOf()
理解原型链的关键:区分三个容易混淆的东西
初学者常混淆 prototype、__proto__ 和 constructor。记住:
-
F.prototype:仅函数有,是被实例的__proto__指向的对象 -
obj.__proto__:任何对象都有,是它查找属性时的上一级原型 -
F.prototype.constructor === F:默认指向原函数,可被改写,不影响原型链本身 - 真正起作用的是
__proto__的指向关系,constructor只是个参考属性,不参与查找
原型链不是黑箱,它是一条清晰的、单向的、向上的属性访问路径。搞懂谁指向谁、什么时候触发查找、终点在哪,就能自然理解 JS 的“继承”行为。不复杂但容易忽略细节。











