js 继承有哪些方式

JavaScript 中实现继承的方式有多种,每种方式都有其特点和适用场景。以下是一些常见的继承模式:

1. 原型链继承

原型链继承是最基础的继承方式,它通过将子类的原型对象指向父类的一个实例来实现属性和方法的共享。

示例代码:
javascript 复制代码
function Parent() {
    this.name = 'parent';
}

Parent.prototype.getName = function() {
    return this.name;
};

function Child() {
    // 无需额外操作
}

Child.prototype = new Parent(); // 关键点:让Child的prototype指向Parent的一个实例
Child.prototype.constructor = Child;

var child = new Child();
console.log(child.getName()); // 输出: parent

2. 构造函数继承

构造函数继承涉及到在子类的构造函数内部调用父类的构造函数,并且改变父类构造函数中的this指向子类实例。

示例代码:
javascript 复制代码
function Parent() {
    this.name = 'parent';
}

function Child() {
    Parent.call(this); // 关键点:在Child构造函数中调用Parent,并绑定this
}

var child = new Child();
console.log(child.name); // 输出: parent

3. 组合继承(经典继承)

组合继承结合了原型链继承和构造函数继承的优点,通过在子类的构造函数中调用父类的构造函数,并且让子类的原型指向父类的原型的一个实例来实现继承。

示例代码:
javascript 复制代码
function Parent(name) {
    this.name = name;
}

Parent.prototype.getName = function() {
    return this.name;
};

function Child(name, age) {
    Parent.call(this, name); // 调用Parent构造函数
    this.age = age;
}

Child.prototype = new Parent(); // 继承Parent的原型方法
Child.prototype.constructor = Child;

var child = new Child('parent', 10);
console.log(child.getName()); // 输出: parent
console.log(child.age);       // 输出: 10

4. 寄生组合继承

寄生组合继承改进了组合继承中的一个问题:每次创建子类实例时,父类构造函数都会被调用两次。它使用一个中间函数来继承父类的原型属性。

示例代码:
javascript 复制代码
function inheritPrototype(subType, superType) {
    var prototype = Object.create(superType.prototype);
    prototype.constructor = subType;
    subType.prototype = prototype;
}

function Parent(name) {
    this.name = name;
}

Parent.prototype.getName = function() {
    return this.name;
};

function Child(name, age) {
    Parent.call(this, name);
    this.age = age;
}

inheritPrototype(Child, Parent);

var child = new Child('parent', 10);
console.log(child.getName()); // 输出: parent
console.log(child.age);       // 输出: 10

5. ES6 类继承

ES6 引入了类的概念

相关推荐
threerocks14 分钟前
AI 原生软件开发生命周期手册 - 如何借助 AI,逐阶段改造软件开发生命周期
前端·javascript·后端
lzhdim16 分钟前
提高 SQL 语句执行速度的方法
java·开发语言·数据库·sql·oracle
JavaPub-rodert20 分钟前
王仕宇在 Go Context 如何解决协程泄漏与超时控制
开发语言·后端·golang·iphone·javapub·王仕宇
ly76892 小时前
JavaScript 从入门到进阶:核心语法、异步编程与工程化实践
开发语言·javascript·ecmascript
落魄大学生之流水线上谋生计2 小时前
Java锁全面指南:从基础概念到企业级应用
java·开发语言
for_ever_love__2 小时前
python基础语法学习: 闭包
开发语言·python·学习·闭包
ly76892 小时前
Python 全面入门:从核心语法到工程实践
开发语言·python
艾伦_耶格宇3 小时前
【AI】-4 OpenCode Go 接入 Obsidian 完整指南
运维·开发语言·人工智能·agent·opencode
沙盘客4 小时前
AFSIM 示例解读(03)· 六自由度飞行仿真 six_dof(下):机场运作与弹道导弹投送
java·javascript·经验分享
旋生万物4 小时前
【终极实战】用Python从零“生成“一个宇宙:螺旋干涉模型的代码实现
开发语言·前端·人工智能·react.js·php·wpf