javascript继承的底层逻辑由引擎用c++实现,核心包括:①new操作符初始化实例并设置[[prototype]];②属性查找沿原型链逐级向上至null;③class/extends是语法糖,本质仍为原型链与构造函数继承。

JavaScript 继承没有“底层源码”可直接查看,因为它是引擎内部机制,不是用 JavaScript 写的。V8、SpiderMonkey 等引擎用 C++ 实现原型链查找、[[Prototype]] 链接、new 操作符行为等核心逻辑。但我们可以从规范定义 + 引擎行为 + 可观测的 JS 行为还原其底层实质。
下面分三块讲清楚真正起作用的底层逻辑:
构造函数调用时的实例初始化过程
当你写 new Parent(),引擎实际做的是:
- 创建一个空对象
- 将该对象的
[[Prototype]]内部属性设为Parent.prototype(不是__proto__,那是非标准访问方式) - 以该对象为
this执行Parent函数体 - 若函数无显式返回对象,则自动返回该新对象
这个 [[Prototype]] 的赋值,是继承能成立的第一步——它让实例有了向上查找的路径。
属性与方法的查找链(原型链遍历)
访问 obj.method() 时,引擎执行严格查找流程:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 先查
obj自身是否有method(自有属性) - 没有则读取
obj.[[Prototype]],去那个对象上查 - 还没有,继续读取
obj.[[Prototype]].[[Prototype]],逐级向上 - 直到
null(即Object.prototype.__proto__ === null)为止
这个过程完全由引擎在 C++ 层实现,不暴露源码,但可通过 Object.getPrototypeOf(obj) 和 Object.setPrototypeOf() 观测和干预。
class 和 extends 是语法糖,本质仍是原型操作
class Child extends Parent 编译后等价于:
function Child(...args) {
Parent.call(this, ...args); // 构造函数继承(属性)
}
Child.prototype = Object.create(Parent.prototype); // 原型链继承(方法)
Child.prototype.constructor = Child;
V8 在解析 extends 时,会强制检查 Parent 是否可被继承(必须是函数或 null),并在 new Child() 时自动插入 super() 调用校验,这些都在编译/执行阶段由引擎保障,不是 JS 层代码。
不复杂但容易忽略
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










