当前位置:首页 > JavaScript

js实现继承怎么实现

2026-04-06 15:31:28JavaScript

原型链继承

通过将子类的原型指向父类的实例实现继承。子类实例可以访问父类原型上的属性和方法。

function Parent() {
  this.name = 'Parent';
}
Parent.prototype.sayName = function() {
  console.log(this.name);
};

function Child() {}
Child.prototype = new Parent(); // 核心步骤

const child = new Child();
child.sayName(); // 输出 "Parent"

缺点:父类引用类型属性会被所有子类实例共享;无法向父类构造函数传参。

构造函数继承

在子类构造函数中调用父类构造函数,通过 callapply 改变 this 指向。

function Parent(name) {
  this.name = name;
}
function Child(name) {
  Parent.call(this, name); // 核心步骤
}

const child = new Child('Child');
console.log(child.name); // 输出 "Child"

优点:可向父类传参,避免引用属性共享。
缺点:无法继承父类原型上的方法。

组合继承

结合原型链继承和构造函数继承,既保留原型链特性,又避免引用共享问题。

function Parent(name) {
  this.name = name;
}
Parent.prototype.sayName = function() {
  console.log(this.name);
};

function Child(name) {
  Parent.call(this, name); // 继承属性
}
Child.prototype = new Parent(); // 继承方法

const child = new Child('Child');
child.sayName(); // 输出 "Child"

缺点:父类构造函数被调用两次(Parent.callnew Parent()),性能损耗。

js实现继承怎么实现

原型式继承

基于已有对象创建新对象,通过 Object.create() 实现。

const parent = {
  name: 'Parent',
  sayName: function() {
    console.log(this.name);
  }
};
const child = Object.create(parent); // 核心步骤
child.name = 'Child';
child.sayName(); // 输出 "Child"

适用场景:不需要构造函数的简单对象继承。
缺点:引用类型属性仍会被共享。

寄生式继承

在原型式继承基础上增强对象,添加额外方法或属性。

js实现继承怎么实现

function createChild(parent) {
  const child = Object.create(parent);
  child.newMethod = function() {
    console.log('New method');
  };
  return child;
}
const parent = { name: 'Parent' };
const child = createChild(parent);
child.newMethod(); // 输出 "New method"

缺点:与原型式继承类似,无法复用方法。

寄生组合式继承

最优解决方案,通过 Object.create() 避免重复调用父类构造函数。

function Parent(name) {
  this.name = name;
}
Parent.prototype.sayName = function() {
  console.log(this.name);
};

function Child(name) {
  Parent.call(this, name); // 继承属性
}
Child.prototype = Object.create(Parent.prototype); // 继承方法
Child.prototype.constructor = Child; // 修复构造函数指向

const child = new Child('Child');
child.sayName(); // 输出 "Child"

优点:只调用一次父类构造函数,避免原型链冗余,保持原型链完整性。

ES6 Class 继承

使用 extendssuper 语法糖实现继承,本质是寄生组合式继承的语法封装。

class Parent {
  constructor(name) {
    this.name = name;
  }
  sayName() {
    console.log(this.name);
  }
}

class Child extends Parent {
  constructor(name) {
    super(name); // 调用父类构造函数
  }
}

const child = new Child('Child');
child.sayName(); // 输出 "Child"

优势:语法简洁,符合现代 JavaScript 标准。

标签: js
分享给朋友:

相关文章

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…

js实现 功能

js实现 功能

在 JavaScript 中实现功能通常涉及多个关键步骤,具体取决于功能需求。以下是常见功能的实现方法和示例: 基本功能实现 使用函数封装逻辑是最直接的方式。例如,实现一个计算两数之和的函数: f…

js实现滚动

js实现滚动

实现滚动效果的方法 在JavaScript中实现滚动效果可以通过多种方式完成,以下是一些常见的方法: 使用window.scrollTo() window.scrollTo()方法可以将页面滚动到指…

js分页实现

js分页实现

分页的基本原理 分页的核心是通过计算当前页码和数据偏移量,从服务器或本地数据中截取对应范围的数据进行展示。通常需要以下参数:当前页码(currentPage)、每页条数(pageSize)、总数据量(…

js 实现递归

js 实现递归

递归的基本概念 递归是指函数直接或间接调用自身的过程。在JavaScript中,递归通常用于解决可以分解为相似子问题的问题,如阶乘、斐波那契数列、树形结构遍历等。 递归的实现要点 基线条件(Base…

js 实现全选

js 实现全选

实现全选功能的方法 使用 JavaScript 实现全选功能通常需要操作复选框(checkbox)的状态。以下是几种常见的实现方式。 通过 DOM 操作实现全选 // 获取全选复选框和子复选框 co…