当前位置:首页 > JavaScript

js继承如何实现的

2026-03-01 00:55:15JavaScript

原型链继承

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

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

function Child() {}
Child.prototype = new Parent();

const child = new Child();
child.say(); // 'parent'

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

构造函数继承

在子类构造函数中调用父类构造函数,使用call/apply改变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.say = function() {
  console.log(this.name);
};

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

const child = new Child('child');
child.say(); // 'child'

缺点:调用了两次父类构造函数,子类原型上会存在多余属性。

原型式继承

通过Object.create基于已有对象创建新对象,类似原型链继承的简化版。

const parent = {
  name: 'parent',
  say: function() {
    console.log(this.name);
  }
};

const child = Object.create(parent);
child.name = 'child';
child.say(); // 'child'

寄生式继承

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

function createChild(parent) {
  const child = Object.create(parent);
  child.sayHi = function() {
    console.log('hi');
  };
  return child;
}

寄生组合式继承

目前最理想的继承方式,只调用一次父类构造函数,保持原型链不变。

function inherit(Child, Parent) {
  const prototype = Object.create(Parent.prototype);
  prototype.constructor = Child;
  Child.prototype = prototype;
}

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

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

const child = new Child('child');
child.say(); // 'child'

ES6 class继承

使用extends关键字实现类继承,语法更简洁。

js继承如何实现的

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

class Child extends Parent {
  constructor(name) {
    super(name);
  }
}

const child = new Child('child');
child.say(); // 'child'

ES6继承实质是语法糖,底层仍使用寄生组合式继承。

标签: 如何实现js
分享给朋友:

相关文章

vue如何实现注册

vue如何实现注册

Vue 注册功能实现步骤 注册功能通常涉及前端表单、数据验证、与后端API交互等环节。以下是基于Vue 3和Element Plus的典型实现方式: 表单设计与数据绑定 使用Vue的v-model实…

js实现全选

js实现全选

实现全选功能的方法 在JavaScript中实现全选功能通常涉及监听全选复选框的点击事件,并根据其状态控制其他复选框的选中状态。以下是几种常见的实现方式: 基础DOM操作实现 通过获取所有目标复选框…

vue如何实现tap

vue如何实现tap

Vue 中实现类似移动端 tap 事件的方法 在 Vue 中可以通过以下几种方式实现类似移动端 tap(轻触)事件的效果: 使用第三方库 安装 v-tap 指令库可以快速实现 tap 事件: np…

js实现自举

js实现自举

实现 JavaScript 自举的方法 JavaScript 自举(Bootstrap)通常指通过 JavaScript 动态加载自身或依赖的脚本,实现运行时环境的初始化或扩展。以下是几种常见实现方式…

java如何实现异步

java如何实现异步

Java实现异步的方法 Java中实现异步编程可以通过多种方式,每种方式适用于不同的场景和需求。以下是常见的实现方法: 使用Thread类 创建新线程执行异步任务是最基础的方式。通过继承Thread…

react如何实现录音

react如何实现录音

使用React实现录音功能 在React中实现录音功能通常需要借助浏览器的MediaRecorder API。以下是实现步骤: 获取用户麦克风权限 需要请求用户授权访问麦克风设备,使用navigat…