在 JavaScript 中,实现继承的方法有多种

简介: 【6月更文挑战第15天】JavaScript 继承常见方法包括:1) 原型链继承,利用原型查找,实例共享原型属性;2) 借用构造函数,避免共享,但方法不在原型上复用;3) 组合继承,结合两者优点,常用但有额外开销;4) ES6 的 class,语法糖,仍基于原型链,提供直观的面向对象编程。

在 JavaScript 中,实现继承的方法有多种,以下是一些常见的实现方式:

  1. 原型链继承

这是 JavaScript 中最常用的继承方式,它基于原型链的查找机制实现。

javascript
function Parent() {
this.name = 'parent';
}

Parent.prototype.sayHello = function() {
console.log('Hello from Parent');
}

function Child() {
this.type = 'child';
}

// 关键步骤:将 Child 的原型指向 Parent 的实例
Child.prototype = new Parent();

var child = new Child();
console.log(child.name); // 'parent'
child.sayHello(); // 'Hello from Parent'
但是,原型链继承有一个问题,那就是所有的实例都会共享原型上的属性,这可能会在某些情况下引发问题。

  1. 借用构造函数(伪经典继承)

通过调用父类构造函数,增强子类实例,将父类的属性添加到子类实例上。

javascript
function Parent() {
this.name = 'parent';
}

function Child() {
// 关键步骤:调用 Parent 构造函数
Parent.call(this);
this.type = 'child';
}

var child = new Child();
console.log(child.name); // 'parent'
这种方式可以解决原型链继承的问题,但是方法都在构造函数中定义,每次创建实例都会生成一次方法,方法复用就无从谈起了。

  1. 组合继承

将原型链继承和借用构造函数的技术组合到一块,从而发挥二者之长的一种继承模式。

javascript
function Parent() {
this.name = 'parent';
}

Parent.prototype.sayHello = function() {
console.log('Hello from Parent');
}

function Child() {
// 借用构造函数
Parent.call(this);
this.type = 'child';
}

// 原型链继承
Child.prototype = new Parent();
Child.prototype.constructor = Child;

var child = new Child();
console.log(child.name); // 'parent'
child.sayHello(); // 'Hello from Parent'
这种方式既可以实现在子类构造函数中向父类构造函数传参,又可实现函数复用,因此是 JavaScript 中最常用的继承方式。

  1. ES6 的 class 继承

ES6 引入了 class(类),使得 JavaScript 的面向对象编程变得更加方便和直观。

javascript
class Parent {
constructor() {
this.name = 'parent';
}
sayHello() {
console.log('Hello from Parent');
}
}

class Child extends Parent {
constructor() {
super(); // 调用父类的 constructor
this.type = 'child';
}
}

let child = new Child();
console.log(child.name); // 'parent'
child.sayHello(); // 'Hello from Parent'
ES6 的 class 继承方式简洁明了,使得 JavaScript 的面向对象编程更加接近其他面向对象的语言。但是,请注意,ES6 的 class 实质上是基于原型链的语法糖,底层的实现仍然是原型链。

目录
相关文章
|
10天前
|
JavaScript API
js【最佳实践】遍历数组的八种方法(含数组遍历 API 的对比)for,forEach,for of,map,filter,reduce,every,some
js【最佳实践】遍历数组的八种方法(含数组遍历 API 的对比)for,forEach,for of,map,filter,reduce,every,some
23 1
|
14天前
|
JavaScript
js【详解】call()、apply()、bind()方法
js【详解】call()、apply()、bind()方法
24 6
|
12天前
|
JavaScript 前端开发
JavaScript中exec()方法详解
在这个示例中,exec()方法会找到两个匹配项,并打印出它们在字符串中的位置。
11 1
|
14天前
|
JavaScript 前端开发 容器
vue组件封装——固定宽高比的容器(2种方法:纯CSS实现 + JS实现)
vue组件封装——固定宽高比的容器(2种方法:纯CSS实现 + JS实现)
18 2
|
14天前
|
JavaScript
vue 全局响应键盘按键/监听键盘事件(含 js 获取键盘keyCode值的方法)
vue 全局响应键盘按键/监听键盘事件(含 js 获取键盘keyCode值的方法)
24 2
|
14天前
|
存储 JavaScript 前端开发
使用JavaScript的indexOf方法
使用JavaScript的indexOf方法
|
14天前
|
前端开发 JavaScript
js 等待接口访问成功后执行指定代码【3种方法】(含async await Promise的使用)
js 等待接口访问成功后执行指定代码【3种方法】(含async await Promise的使用)
8 1
|
14天前
|
JavaScript 前端开发 索引
JavaScript编码之路 【JavaScript之操作数组、字符串方法汇总】(三)
JavaScript编码之路 【JavaScript之操作数组、字符串方法汇总】(三)
16 1
|
11天前
|
JavaScript
JS数组操作---删除,arr.pop()方法从数组中删除最后一个元素,并返回该元素的值,arr.shift() 删除第一个值,arr.splice()方法,删除指定元素,arr.splice,从第一
JS数组操作---删除,arr.pop()方法从数组中删除最后一个元素,并返回该元素的值,arr.shift() 删除第一个值,arr.splice()方法,删除指定元素,arr.splice,从第一
|
11天前
|
JavaScript
Js,定义数组的方法,let 数组名 = [数据1,数据2,........,数据n],取值方法,数组名[x],arr[0],let sum sum = sum + arr[0],求和的写法,平均值
Js,定义数组的方法,let 数组名 = [数据1,数据2,........,数据n],取值方法,数组名[x],arr[0],let sum sum = sum + arr[0],求和的写法,平均值