JavaScript继承基于原型链委托而非类复制;原型链继承可复用方法但共享引用属性且无法传参;借用构造函数可传参并隔离属性但无法复用原型方法;组合式继承结合二者优点但父类构造函数被调用两次;ES6 class是原型链的语法糖,简洁安全且为当前主流方案。

JavaScript 的继承不是靠“类复制”,而是靠对象之间建立委托关系——一个对象找不到某个属性或方法时,会顺着 __proto__ 链向上查找,直到 null。这个查找路径就是原型链,也是所有继承方案的底层基础。
原型链继承:最简但有硬伤
把子类的 prototype 直接设为父类的一个实例,就能让子类实例访问父类的属性和原型方法。
- ✅ 能复用父类原型上的方法(比如
say()) - ❌ 父类构造函数里定义的引用类型(如
this.arr = [1,2,3])会被所有子类实例共享 - ❌ 创建子类实例时无法给父类构造函数传参(比如
new Parent('张三')这样的初始化逻辑进不去)
借用构造函数继承:解决共享问题,但丢掉方法复用
在子类构造函数中用 Parent.call(this, ...args) 执行父类构造逻辑,把父类的实例属性真正“拷贝”到每个子类实例上。
用于 inference.sh 的 JavaScript/TypeScript SDK,可运行 AI 应用、构建代理、集成 150+ 模型。包名:@inferencesh/sdk(npm install),完整 TypeScript 支持。
- ✅ 每个子类实例拥有独立的属性(修改
child1.arr不影响child2.arr) - ✅ 支持向父类传参(
new Child('李四', 25)) - ❌ 子类无法访问父类原型上的方法(
child1.say()会报错) - ❌ 方法不能复用,每次新建实例都重新创建一份,浪费内存
组合式继承:原型链 + 构造函数调用
把上面两种方式合起来:用原型链继承父类方法,用 call 继承父类实例属性。这是 ES5 时代最常用、最稳妥的方案。
立即学习“Java免费学习笔记(深入)”;
- ✅ 实例属性隔离,方法复用到位
- ✅ 支持构造函数传参
- ⚠️ 小缺陷:父类构造函数会被调用两次(一次在设置
Child.prototype = new Parent()时,一次在Parent.call(this)时),虽不影响功能,但略低效
ES6 class 继承:语法糖,本质仍是原型链
class 和 extends 看似像 Java,其实只是对原型继承的封装。编译后还是基于 __proto__ 和 prototype 的操作。
- ✅ 语法简洁,语义清晰,支持
super()、静态方法、getter/setter - ✅ 底层自动处理了 constructor 修正、原型链连接等细节
- ✅ 是当前主流项目推荐写法(只要运行环境支持 ES6+)
- ⚠️ 注意:
class声明不会被提升,必须先定义父类再定义子类

















