当前位置:首页 > JavaScript

js实现继承原理

2026-04-04 03:23:08JavaScript

JavaScript 继承的实现原理

JavaScript 的继承基于原型链机制,主要通过原型对象(prototype)实现。以下是常见的几种继承方式及其原理:

原型链继承

通过将子类的原型指向父类的实例实现继承。

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"
  • 优点:简单直观
  • 缺点:所有子类实例共享父类引用属性

构造函数继承

在子类构造函数中调用父类构造函数。

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"
  • 优点:结合两种继承方式的优点
  • 缺点:父类构造函数被调用两次

原型式继承

基于已有对象创建新对象。

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

const child = Object.create(parent);
child.name = 'Child';
child.sayName(); // 输出 "Child"
  • 优点:简单灵活
  • 缺点:与原型链继承类似,存在引用属性共享问题

寄生组合式继承

目前最理想的继承方式。

function inheritPrototype(child, parent) {
  const prototype = Object.create(parent.prototype);
  prototype.constructor = child;
  child.prototype = prototype;
}

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

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

inheritPrototype(Child, Parent);

const child = new Child('Child');
child.sayName(); // 输出 "Child"
  • 优点:只调用一次父类构造函数,避免创建多余属性
  • 缺点:实现稍复杂

ES6 class 继承

ES6 引入的 class 语法糖。

js实现继承原理

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"
  • 优点:语法简洁,更接近传统面向对象语言
  • 缺点:本质仍是原型继承的语法糖

每种继承方式都有其适用场景,理解其原理有助于根据实际需求选择最合适的实现方式。

标签: 原理js
分享给朋友:

相关文章

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js实现抽奖

js实现抽奖

实现抽奖功能的基本思路 抽奖功能的核心是随机选择奖项并展示结果。可以通过数组存储奖项,利用随机数生成索引,最后通过动画增强用户体验。 准备奖项数据 定义一个数组存储奖项信息,每个奖项可以包含名称、图…

vue如何实现原理

vue如何实现原理

Vue 实现原理的核心机制 Vue.js 的核心实现原理基于响应式系统、虚拟 DOM 和组件化设计。以下是关键机制的详细解析: 响应式系统 Vue 通过 Object.defineProperty(…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

js实现代码雨

js实现代码雨

实现代码雨效果 使用HTML5 Canvas和JavaScript可以轻松实现经典的代码雨效果。以下是完整的实现代码和说明: HTML结构 <!DOCTYPE html> <htm…