JS 的继承方式与使用场景对比分析
目录
在 JavaScript 中,继承的实现方式主要有以下几种,每种方式适用于不同的场景:
一、原型链继承
实现方式:
function Parent() { this.name = 'Parent'; } Parent.prototype.say = function() { return this.name; }; function Child() {} Child.prototype = new Parent(); // 原型继承关键 const child = new Child(); child.say(); // 输出 "Parent"
特点:
- 子类实例通过原型链访问父类属性和方法
- 问题:父类的引用类型属性会被所有子类实例共享
场景:
- 简单继承结构,无引用类型共享问题需求的场景
- 老项目快速实现继承(现代开发不推荐优先使用)
二、构造函数继承
实现方式:
function Parent(name) { this.name = name; } function Child(name) { Parent.call(this, name); // 构造函数继承关键 } const child = new Child('Child'); child.name; // 输出 "Child"
特点:
- 将父类属性复制到子类实例
- 优点:解决引用属性共享问题
- 缺陷:无法继承父类原型上的方法
场景:
- 需要 实例属性独立性的场景(如每个对象需要独立状态)
- 不支持子类复用父类原型方法(若无需复用则合适)
三、组合继承(经典继承)
实现方式:
function Parent(name) { this.name = name; } Parent.prototype.say = function() { return this.name }; function Child(name) { Parent.call(this, name); // 第1次调用父类构造函数 } Child.prototype = new Parent(); // 第2次调用父类构造函数(问题根源) Child.prototype.constructor = Child; const child = new Child('Child'); child.say(); // 输出 "Child"
特点:
- 结合原型链继承(方法继承)和构造函数继承(属性继承)
- 缺陷:父类构造函数被调用两次,子类原型中存在冗余属性
场景:
- 传统项目的常规继承需求(ES6 出现前的常见方案)
- 需要同时满足方法复用和实例属性独立的场景
四、原型式继承
实现方式:
const parent = { name: 'Parent', friends: ['Alice'] }; const child = Object.create(parent); // 核心API child.name = 'Child'; child.friends.push('Bob'); // friends被所有基于parent创建的对象共享
特点:
- 类似于对象浅拷贝
- 问题:引用类型属性共享(与原型链相同)
场景:
- 简单对象继承需求(无构造函数存在的场景)
- 原型链的极简替代方案(如旧环境无
Object.create
时的polyfill
)
五、寄生式继承
实现方式:
function createChild(parent) { const obj = Object.create(parent); obj.sayHi = () => 'Hi'; // 添加额外方法 return obj; } const child = createChild({ name: 'Parent' });
特点:
- 工厂模式增强对象
- 缺陷:方法无法复用,类似构造函数问题
场景:
- 需要给对象快速扩展额外方法的场景
- 不适合大型继承结构(复用性差)
六、寄生组合式继承(最优解)
实现方式:
function inheritPrototype(Child, Parent) { const prototype = Object.create(Parent.prototype); // 创建父类原型的副本 prototype.constructor = Child; // 修复构造函数指向 Child.prototype = prototype; // 赋值给子类原型 } function Parent(name) { this.name = name; } Parent.prototype.say = function() { return this.name; }; function Child(name) { Parent.call(this, name); // 属性继承 } inheritPrototype(Child, Parent); // 方法继承
特点:
- 只调用一次父类构造函数,避免组合继承的冗余问题
- 保留完整的原型链结构
场景:
- 现代项目推荐的标准继承方式
- 适用于所有复杂继承需求(效率最高)
七、ES6 class 继承
实现方式:
class Parent { constructor(name) { this.name = name } say() { return this.name } } class Child extends Parent { // extends 关键字 constructor(name) { super(name); // super调用父类构造函数 } } const child = new Child('Child'); child.say(); // 输出 "Child"
特点:
- 语法糖,本质基于原型和寄生组合式继承
- 支持
static
、super
等特性
场景:
- 现代项目首选方式
- 需要清晰类结构、继承关系明确的场景
总结与场景对比
实际开发建议:
- 优先使用 ES6
class
继承(清晰、易维护,Babel 转译后底层使用寄生组合式继承) - 旧项目维护时根据现有模式选择组合或寄生组合继承
4️⃣原型式/寄生式继承主要用于对象克隆而非类继承场景
到此这篇关于JS 的继承方式与使用场景的文章就介绍到这了,更多相关JS 继承方式内容请搜索科站长以前的文章或继续浏览下面的相关文章希望大家以后多多支持科站长!
栏 目:JavaScript
下一篇:Node.js调用DeepSeek API的完整指南
本文标题:JS 的继承方式与使用场景对比分析
本文地址:https://www.fushidao.cc/wangluobiancheng/3166.html
您可能感兴趣的文章
- 02-11js中基本事件的总结(onclick、onblur、onchange等)
- 02-11详解如何在Node.js中使用中间件处理请求
- 02-11Vue3中Provide和Inject的用法及工作原理详解
- 02-11Vue+vant实现图片上传添加水印
- 02-11快速解决 keep-alive 缓存组件中定时器干扰问题
- 02-11uniapp 使用 tree.js 解决模型加载不出来的问题及解决方法
- 02-11基于uniapp vue3 的滑动抢单组件实例代码
- 02-10JavaScript 中的 Map使用指南
- 02-10vue3中使用print-js组件实现打印操作步骤
- 02-10Vue 中v-model的完整用法及v-model的实现原理解析


阅读排行
推荐教程
- 04-23JavaScript Array实例方法flat的实现
- 04-23THREE.JS使用TransformControls对模型拖拽的代码实例
- 04-23Vue3使用v-if指令进行条件渲染的实例代码
- 04-23vue3+ts项目搭建的实现示例
- 04-23JavaScript实现下载超大文件的方法详解
- 04-23vue如何使用pdf.js实现在线查看pdf文件功能
- 04-23vue.js调用python脚本并给脚本传数据
- 12-18使用JavaScript遍历输出页面中的所有元素的方法详解
- 04-23JS加密解密之保存到桌面书签
- 12-18Vue实现滚动加载更多效果的示例代码