JavaScript继承本质是原型链委托查找:对象通过__proto__链接另一对象,逐层向上查找属性和方法直至null;构造函数实例的__proto__指向其prototype,子类通过Object.create(Parent.prototype)继承父类方法并修复constructor。

JavaScript 的继承本质,就是对象通过 __proto__ 链接另一个对象,从而能访问那个对象上的属性和方法。它不是“复制”,而是“委托查找”——你调用一个方法,自己没有,就顺着链往上问,直到找到或走到尽头(null)。
原型链是怎么搭起来的
构造函数创建实例时,实例的 [[Prototype]](即 __proto__)会自动指向该构造函数的 prototype 对象。
-
function Person() {}→Person.prototype是一个对象,自带constructor指回Person -
const p = new Person()→p.__proto__ === Person.prototype为true -
Person.prototype.__proto__ === Object.prototype,而Object.prototype.__proto__ === null,链到此终止
继承怎么发生:靠改子类的 prototype
让子类“继承”父类,关键是把子类的 prototype 设为父类的一个实例(或更推荐地,用 Object.create(Parent.prototype))。
- 直接写
Child.prototype = new Parent():子类原型变成父类实例,于是所有Child实例都能沿链访问Parent.prototype上的方法 - 但这样会把父类的实例属性(比如
this.arr = [1])也挂到原型上,导致所有子类实例共享引用类型数据,容易互相干扰 - 所以更安全的做法是:
Child.prototype = Object.create(Parent.prototype),只继承方法,不带父类实例状态
constructor 属性别丢了
用 Object.create() 替换原型后,Child.prototype.constructor 会指向 Parent,这不是我们想要的。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
- 手动修复:
Child.prototype.constructor = Child - 否则
new Child()实例的constructor查出来是Parent,语义错乱
属性查找过程就是继承的运行时体现
当你写 child.say(),JS 引擎按顺序查找:
- 先看
child自身有没有say - 没有?查
child.__proto__(即Child.prototype) - 还没?查
Child.prototype.__proto__(即Parent.prototype) - 再没?继续向上到
Object.prototype,最后到null
这个逐层向上委托的过程,就是原型链继承在运行时的真实模样。

















