广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >JavaScript实现继承的7种方式总结
  • 894
分享到

JavaScript实现继承的7种方式总结

JavaScript实现继承方式JavaScript继承方式JavaScript继承 2023-05-14 08:05:58 894人浏览 薄情痞子
摘要

目录什么是继承实现继承的6种方式1. 原型链继承2. 构造函数继承3. 组合继承(伪经典继承)4. 原型式继承5. 寄生式继承6.寄生组合式继承7.class 类继承什么是继承 用官

什么是继承

用官方点的话讲继承是面向对象三大特征之一,可以使得子类具有父类的属性和方法,同时还可以在子类中重新定义以及追加属性和方法。通俗的来说继承就是子类可以从父类那里复用一些属性和方法,从而达到复用代码的一个效果。

实现继承的6种方式

  • 原型链继承
  • 构造函数继承
  • 组合继承(伪经典继承)
  • 原型式继承
  • 寄生式继承
  • 寄生组合式继承
  • class 类继承

1. 原型链继承

function Person() {
    this.name = 'bruce'
    this.age = 18
    this.gender = '男'
    this.like = {
        sport: 'running',
        book: 'javascript'
    }
    this.getName = function() {
        console.log(this.name);
    }
}

function Student() {
    this.school = '新华小学'
}

let s = new Student()
console.log(s.name);   // 未继承前 undefined

Student.prototype = new Person()  // 继承之后
let s1 = new Student()
s1.getName()  // bruce
console.log(s1.like.book);  // JavaScript
s1.like.book = 'Java'   // 修改引用类型的值
s1.name = 'jack'  // 修改非引用类型的值
console.log(s1.like.book);  // Java
s1.getName()  // jack
console.log('----------');
let s2 = new Student()
s2.getName()  // bruce
console.log(s2.like.book);  // Java

所谓的原型链继承,在我的理解就是子类通过原型链来继承到父类的属性,在上面的代码中我们也可以看到在子类实例s没有继承到父类的属性时,子类去访问父类才有的属性值为:undefined

在将父类实例对象挂载到子类Student构造函数的原型上面后,那么此时子类的原型上面就有了父类的全部属性。因为Person的实例对象被显示的挂载到了Student的原型上面。所以子类在继承之后,所有实例化的子类都拥有了跟父类一样的属性,于是这样子类就通过原型链实现了继承。

优点: 子类可以继承到父类的方法。

缺点:

  • 会在子类实例上共享父类所有的引用类型数据,也就是子类的原型被父类属性覆盖。
  • 子类实例不能给父类构造函数传参。
function Person(t) {
    this.property = t
}

function Student(t) {
    this.typeproperty = t
}
Student.prototype = new Person()
let s=new Student('a')
console.log(s.property)  // undefined
console.log(s.typeproperty)  // a

这样子类实例传的参数就不能给到父类构造函数里面了。

2. 构造函数继承

function Person(name,age) {
    this.name = name
    this.age = age
    this.like = {
        sport: 'running',
        book: 'JavaScript'
    }
    this.getName = function () {
        console.log(this.name);
    }
}
Person.prototype.sayHello = function () {
    console.log('你好');
}

function Student(name, age,) {
    Person.call(this, name, age)  // 借用构造函数
}

let s1 = new Student('bruce',18)
s1.getName()   // bruce
s1.name='jack'
s1.getName()  // jack
s1.like.sport='swimming'
console.log(s1.like.sport);  // swimming
console.log('------');
let s2=new Student('lucy',19)
s2.getName()  // lucy
console.log(s2.like.sport);  // running 

构造函数继承就是使用强制改变 this 指向,借用一个构造函数继承。相较于原型链继承,构造函数继承不会共享父类上的引用类型数据,不会互相影响。

缺点:1.不能访问到父类原型属性上面的方法和参数,即 Person.prototype 上的都不能访问到。

Person.prototype.sayHello = function () {  // 在 Person 的原型上面加一个方法
    console.log('你好');
}

let s1 = new Student('bruce',18)
s1.sayHello()  // s1.sayHello is not a function

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

相较于原型链继承,构造函数继承好像已经非常完美了,但是它还是存在着一个最大的缺点就是:不能继承到父类的原型上面的属性。但是原型链继承就好像没有这个问题,如果将这两个继承方式组合起来搭配使用是不是就能解决掉所有问题,于是这就有了组合继承。

function Person(name, age) {
    this.name = name
    this.age = age
    this.like = {
        sport: 'running',
        book: 'JavaScript'
    }
    this.getName = function () {
        console.log(this.name);
    }
}
Person.prototype.sayHello = function () {
    console.log('你好');
}

function Student(name, age) {
    Person.call(this, name, age)  // 构造函数继承
}
Student.prototype = new Person()  // 原型链继承

let s1 = new Student('bruce', 18)
s1.sayHello() // 你好
console.log(s1);

上面先在子类内使用构造函数继承将父类的显示属性挂载到子类上面,此时仍然存在着构造函数继承中子类不能访问到父类原型上面属性的缺点。

所以下面配合原型链继承将父类实例挂载到子类的原型上,此时子类就可以访问父类的原型上的属性,同时构造函数继承将子类的原型被父类属性覆盖的问题解决。

组合继承将前面两种继承的缺点都补全了,但是它也有缺点:

不足:重复调用两次父类函数。

4. 原型式继承

function object(o){  // 参数为父类  
    function F(){}  
    F.prototype=o  
    return new F()  
}  
  
const person={  
    sex:'man',  
    age:20  
}  
  
let realPerson=object(person)  
console.log(realPerson.sex);// man  

通过在一个构造函数的原型上挂载父类,此时再将这个挂载了父类的构造函数实例返回出来,那么这个实例的隐式原型就为这个父类,所以此时子类实例对象可以访问到父类上的属性,这就是原型式继承。这个看起来跟理解起来是不是跟原型链继承很像,也挺好理解的。

缺点: 如果父类属性有引用类型,那么这个引用类型也会被共享出来。

 function object(o){  
    function F(){}  
    F.prototype=o  
    return new F()  
}  
  
const person={  
    sex:'man',  
    age:20,  
    like:{  
        sports:'running'  
    }  
}  
  
let r1=object(person)  
console.log(r1.like);// { sports: 'running' }  
let r2=object(person)  
r2.like.sports='singing'  
console.log(r1.like); // { sports: 'singing' }  

实例化两个不同的对象,更改 r2 的sports 属性,结果 r1 的 sports 属性也被修改。

5. 寄生式继承

这种继承方式跟原型式继承有着异曲同工之妙,只不过可以增强这个父类。其存在的缺点也与原型式继承一样。

 function createPerson(original) {  
    var clone = Object.create(original)  
    clone.say = function() {     // 增强这个对象  
        console.log('hello');  
    }  
    return clone  
}  

6.寄生组合式继承

这个是一个比较完美的继承方式,使用组合继承与寄生继承。

function Person(name, age) {
    this.name = name
    this.age = age
    this.like = {
        sport: 'running',
        book: 'JavaScript'
    }
    this.getName = function () {
        console.log(this.name);
    }
}
Person.prototype.sayHello = function () {
    console.log('你好');
}

function Student(name, age) {
    Person.call(this, name, age)  // 借用构造函数
}
const Fn=function(){}
Fn.prototype=Person.prototype

Student.prototype = new Fn()



let s1 = new Student('bruce', 18)
s1.sayHello() // 你好
console.log(s1);

这种继承方式结合了组合继承,借助一个空的构造函数,将父类的原型挂载到这个空的构造函数上面,然后将其附在子类的原型上面,这样就解决了组合式继承的缺点。

7.class 类继承

Class 可以通过extends关键字实现继承,让子类继承父类的属性和方法。

class Person{
    constructor(name){
        this.name=name
    }
}

class Student extends Person{
    constructor(name,age){
        super(name)
        this.age=age
    }
}

let s=new Student('bruce',20)
console.log(s);  //Student { name: 'bruce', age: 20 }

以上就是JavaScript实现继承的7种方式总结的详细内容,更多关于JavaScript继承的资料请关注编程网其它相关文章!

--结束END--

本文标题: JavaScript实现继承的7种方式总结

本文链接: https://www.lsjlt.com/news/202931.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • JavaScript实现继承的7种方式总结
    目录什么是继承实现继承的6种方式1. 原型链继承2. 构造函数继承3. 组合继承(伪经典继承)4. 原型式继承5. 寄生式继承6.寄生组合式继承7.class 类继承什么是继承 用官...
    99+
    2023-05-14
    JavaScript实现继承方式 JavaScript继承方式 JavaScript继承
  • JavaScript实现继承的6种常用方式总结
    目录1.原型链继承2.借用构造函数继承3.组合继承(经典继承)4.原型式继承方法一:借用构造函数方法二:Object.create()5.寄生式继承6.寄生组合式继承7.ES6、Cl...
    99+
    2022-11-13
  • JavaScript中六种面试常考继承方式总结
    目录原型链继承盗用构造函数组合继承原型式继承寄生式继承寄生式组合继承js的几种继承方式在我们面试的时候经常会被问到,所以深入理解js几种继承方式以及它们的优缺点是非常有必要的。 原型...
    99+
    2023-02-13
    JavaScript继承方式 JavaScript继承
  • js中常见的6种继承方式总结
    目录前言1、原型继承2、盗用构造函数3、组合继承4、原型式继承5、寄生式继承6、寄生式组合继承总结前言 js是门灵活的语言,实现一种功能往往有多种做法,ECMAScript没有明确的...
    99+
    2022-11-13
  • 浅谈JavaScript的几种继承实现方式
    目录当前需求: 实现 Student 继承自 Person构造函数Person构造函数Student希望满足的条件功能利用原形链实现方法的继承方式1: 子类原型指向父类原型方式2 子...
    99+
    2023-05-17
    JavaScrip 继承
  • JS中的六种继承方式以及优缺点总结
    目录前言原型链继承 构造函数继承 组合继承(原型链继承和构造函数继承组合) 寄生式继承 组合寄生式继承 extends继承 总结前言 继承是JS世界中必不可少的一个环节,号称JS的三...
    99+
    2022-11-12
  • JavaScript中常见的几种继承方式
    目录原型继承内存图分析盗用构造函数继承分析组合继承原型链继承寄生式继承寄生组合式继承原型继承 function Parent(name) { this.name = name }...
    99+
    2022-11-13
  • 分享JavaScript 中的几种继承方式
    目录一、原型链1.1 原型链的问题二、盗用构造函数2.1 基本思想2.2 可向父类构造函数传参2.3 盗用构造函数的问题三、组合继承(伪经典继承)3.1 基本思想3.2 组合继承的问...
    99+
    2022-11-13
  • JavaScript继承的三种方法实例
    继承 1. 什么是继承 继承: 首先继承是一种关系,类(class)与类之间的关系,JS中没有类,但是可以通过构造函数模拟类,然后通过原型来实现继承。 继承也是为了数据共...
    99+
    2022-11-12
  • c++继承的实现方式有哪几种
    在C++中,有三种继承的实现方式:公有继承、私有继承和保护继承。 公有继承: 公有继承是最常用的继承方式。使用关键字"publi...
    99+
    2023-10-26
    c++
  • javascript继承实现的方式有哪些
    本文小编为大家详细介绍“javascript继承实现的方式有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“javascript继承实现的方式有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。什么是继承用官...
    99+
    2023-07-05
  • 聊聊JavaScript中实现继承的6种方法
    面试官:“你说说 JavaScript 中实现继承有哪几种方法?”紧张的萌新:“额,class 中用 extends 实现继承,然后...没了...”面试官:“...”······想必绝大部分人一说继承就会想到类中的继承吧,但其实继承可不是...
    99+
    2022-11-22
    javascript
  • SpringMVC实现Controller的三种方式总结
    目录实现Controller的三种方式1.实现Controller接口2.实现HttpRequestHandler接口3.全注解关于SpringMVC的控制器(Controller)...
    99+
    2022-11-13
  • Spring AOP的几种实现方式总结
    Spring AOP的几种实现方式总结如下:1. 基于XML配置:在Spring配置文件中使用元素来定义切面和通知的配置,然后通过元...
    99+
    2023-08-17
    Spring AOP
  • JavaScript中常见的七种继承及实现
    目录1. 原型链继承2. 借用构造函数继承3. 组合继承4. 原型式继承5. 寄生式继承6. 寄生式组合继承7. class继承1. 原型链继承 原型链继承是 JavaScript ...
    99+
    2023-03-08
    JavaScript实现继承方式 JavaScript继承
  • java异步编程的7种实现方式小结
    目录同步编程一、线程 Thread二、Future三、FutureTask四、异步框架 CompletableFuture五、 SpringBoot 注解 @Async六、Sprin...
    99+
    2023-03-23
    java异步编程 Java异步
  • Javascript继承关系的实现方法
    本篇内容介绍了“Javascript继承关系的实现方法”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说明JavaScript中的继承关系是通...
    99+
    2023-06-20
  • Python协程的四种实现方式总结
    目录一、yield关键字实现方式二、greenlet实现方式三、asyncio实现方式四、async和await关键字实现方式一、yield关键字实现方式 以yield关键字方式实现...
    99+
    2023-01-14
    Python实现协程方式 Python协程
  • JavaScript中常见的七种继承怎么实现
    本篇内容主要讲解“JavaScript中常见的七种继承怎么实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript中常见的七种继承怎么实现”吧!1. 原型链继承原型链继承是 Jav...
    99+
    2023-07-05
  • JavaScript实现树结构转换的五种方法总结
    目录方法一:使用递归方法二:使用循环方法三:使用 reduce方法四:使用哈希表方法五:使用深度优先搜索总结在 JavaScript 编程中,将数组转换为树结构是一个常见的需求。本篇...
    99+
    2023-03-15
    JavaScript树结构转换 JavaScript树结构
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作