Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JavaScript实现继承

JavaScript实现继承

作者头像
不作声
发布于 2020-10-30 03:39:54
发布于 2020-10-30 03:39:54
41300
代码可运行
举报
文章被收录于专栏:M不作声M不作声
运行总次数:0
代码可运行

在面向对象编程中有一个很重要的特性,就是继承,通过继承可以减小大量冗余的代码。

JS也是可以面向对象编程的,在JS里也有多种继承方式。

class继承

class是ES6增加的关键字,他的本质还是函数。

使用class继承非常简单。子类使用extends关键字表明继承于哪个类,并在子类中调用super(),这相当于使用call()改变this的指向。

class继承代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Person {
  constructor(value){
    this.value = value
  }
    
  getValue() {
    console.log(this.value)
  }
}

class person {
  constructor(value){
    super(value)
  }
}

let p = new person()
p instanceof person //true
p instanceof Person //true

原型链继承

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Name() {
  this.name = 'name'
}

function Age() {
  this.age = 'age'
}
Age.prototype = new Name() //Age的原型对象是Name的实例对象,将Age添加到原型链上
let age = new Age
console.log(age.name, age.age) //name age

原型链继承就是使用的它的概念对象._proto_ = 构造函数.prototype

构造函数继承

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Father(age) {
  this.name = ['zhao', 'qian']
  this.age = age
}
function Son(age) {
  Father.call(this, age)
}
let son = new Son(12)
console.log(son.age) // 12
console.log(son.name) // ["zhao", "qian"]
son.name.push('zhou') // 3
console.lgo(son.name) // ["zhao", "qian", "zhou"]

组合继承

组合继承是原型链继承+构造函数继承,原型链继承的属性,构造函数继承方法。原型链继承会出现一个问题:包含引用类型值的原型属性,会被所有实例共享。构造函数继承的问题是:没有原型,无法复用

组合继承代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Father(age) {
  this.name = ['zhao', 'qian']
  this.age = age
}
Father.prototype.run = () => { return this.name + ' ' + this.age}

function Son(age) {
  Father.call(this, age)
}

Son.prototype = new Father()
let son = new Son(12)
console.log(son.run()) //zhao,qian 12

这种继承方式通过Father.call(this)继承父类的属性,通过new Father()继承父类的函数。优点在于构造函数可以传参,不会与父类共享属性,缺点是在继承父类函数的时候调用了父类的构造函数

寄生组合继承

组合继承的缺点是在继承时调用了父类的构造函数。寄生组合继承解决了两次调用的问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function Parent (name) {
  this.name = name;
  this.colors = ['red', 'blue', 'green'];
}
  
Parent.prototype.getName = () => { console.log(this.name) }
  
function Child (name, age) {
  Parent.call(this, name);
  this.age = age;
}
 
function prototype(Child,Parent){ //获得父类型原型上的方法
    let prototype = object(Parent.prototype) //创建父类型原型的一个副本,相当于prototype.__proto__ = Parent.prototype
    prototype.constructor = Child
    Child.prototype = prototype
}
 
prototype(Child,Parent) //必须执行这个函数,才能进行给子类型原型写方法,顺序调转的话子类型原型会被重写
Child.prototype.getName = () => { console.log(this.name) }

总结

  • 原型链继承来自父类原型对象的引用属性是所有子类共享的;创建子类实例时,无法向父类构造函数传参
  • 构造函数继承解决了上述问题,但无法实现函数的复用,方法在构造函数中定义,每次创建子类实例都会创建一个新方法,占用内存。
  • 组合继承解决了上述问题,使用原型继承继承父类的属性Parent.call(this),使用构造函数继承父类的方法new Parent()。但子类调用了两次父类构造函数,生成了两个父类实例。
  • 寄生组合继承解决了上述问题,但是使用复杂。
  • class是ES6的语法,使用extends指定继承的父类。

今天不学习,明天变垃圾。

欢迎关注公众号:前端大合集。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大前端合集 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
四种继承模式详解
构造函数A通过new生成a对象,使得A.prototype指向对象b,而对象b由构造函数B生成,这样就形成了原型链的继承关系
子夜星辰
2022/11/15
2800
JS 继承的7种方法,你学会了吗?
在上一篇文章中我们讲解了原型链的机制以及原型相关的一些属性,而与原型链息息相关的就是继承了,为什么这么说呢?
小丞同学
2021/08/23
7040
前端开发,必知ES5、ES6的7种继承
众所周知,在ES6之前,前端是不存在类的语法糖,所以不能像其他语言一样用extends关键字就搞定继承关系,需要一些额外的方法来实现继承。下面就介绍一些常用的方法,红宝书已经概括的十分全面了,所以本文基本就是对红宝书继承篇章的笔记和梳理。
青梅煮码
2023/03/13
2560
JavaScript寄生式组合继承
组合继承也被称为伪经典继承,它综合了我们昨天说的原型链和盗用构造函数,将俩者的有点结合在了一起。它的基本思想是使用原型链继承原型上的属性和方法,通过盗用构造函数继承实例属性,这样的好处就是可以把方法定义在原型上复用,每个实例又有自己的属性。
大熊G
2022/11/14
3040
JavaScript的几种继承方式
这篇文章称为笔记更为合适一些,内容来源于 《JavaScript高级程序设计 (第三版)》第六章 6.3 继承。
木子星兮
2020/07/16
5320
面向对象编程
面向对象把构成问题的transaction分解成各个对象,而建立对象的目的也不是为了完成一个个步骤,而是为了描述某个事物在解决整个问题的过程中所发生的行为,意在写出通用代码,加强代码重用,屏蔽差异性。
子舒
2022/06/09
7040
面向对象编程
对Javascript 类、原型链、继承的理解
  和其他面向对象的语言(如Java)不同,Javascript语言对类的实现和继承的实现没有标准的定义,而是将这些交给了程序员,让程序员更加灵活地(当然刚开始也更加头疼)去定义类,实现继承。(以下不讨论ES6中利用class、extends关键字来实现类和继承;实质上,ES6中的class、extends关键字是利用语法糖实现的)
smy
2019/02/13
6890
对Javascript 类、原型链、继承的理解
JavaScript实现继承的6种方式
创建 Father 的实例,并赋值给 Son 的原型 Son.prototype。实现了 Son 继承 Father,
andyhu
2023/06/18
4070
「思维导图学前端 」一文搞懂Javascript对象,原型,继承
去年开始我给自己画了一张知识体系的思维导图,用于规划自己的学习范围和方向。但是我犯了一个大错,我的思维导图只是一个全局的蓝图,而在学习某个知识点的时候没有系统化,知识太过于零散,另一方面也很容易遗忘,回头复习时没有一个提纲,整体的学习效率不高。意识到这一点,我最近开始用思维导图去学习和总结具体的知识点,效果还不错。试想一下,一张思维导图的某个端点是另一张思维导图,这样串起来的知识链条是多么“酸爽”!当然,YY一下就好了,我保证你没有足够的时间给所有知识点都画上思维导图,挑重点即可。
程序员白彬
2020/07/10
7780
「思维导图学前端 」一文搞懂Javascript对象,原型,继承
JavaScript对象的继承
基于原型链,即把一个对象的原型设置为另一个对象的实例,那么这个对象实例也就拥有了另一个对象上的属性。
闲花手札
2021/11/17
7410
JavaScript两种继承方式详解
由于js不像java那样是真正面向对象的语言,js是基于对象的,它没有类的概念。所以,要想实现继承,可以用js的原型prototype机制或者用apply和call方法去实现
疯狂的技术宅
2019/03/27
7010
javascript 面向对象(实现继承的几种方式)
 1、原型链继承 核心: 将父类的实例作为子类的原型 缺点: 父类新增原型方法/原型属性,子类都能访问到,父类一变其它的都变了 function Person (name) { this.name = name; }; Person.prototype.getName = function () { //对原型进行扩展 return this.name; }; funct
柴小智
2018/04/10
7010
JS原型链与继承别再被问倒了
继承是OO语言中的一个最为人津津乐道的概念.许多OO语言都支持两种继承方式: 接口继承 和 实现继承 .接口继承只继承方法签名,而实现继承则继承实际的方法.由于js中方法没有签名,在ECMAScript中无法实现接口继承.ECMAScript只支持实现继承,而且其 实现继承 主要是依靠原型链来实现的.
全栈程序员站长
2021/06/10
6340
深入浅出js实现继承的7种方式
  有些人认为JavaScript并不是真正的面向对象语言,在经典的面向对象语言中,您可能倾向于定义类对象,然后您可以简单地定义哪些类继承哪些类(参考C++ inheritance里的一些简单的例子),JavaScript使用了另一套实现方式,继承的对象函数并不是通过复制而来,而是通过原型链继承
TimothyJia
2019/11/12
2.1K0
Javascript 的继承总结
写惯了 TypeScript 的人很容易了解继承(extends),比如类的继承和接口的继承等,传送门:www.tslang.cn/docs/handbo… ,但是对于ES2015出现之前,JavaScript如何实现继承的呢?毫无疑问,只能通过原型链的方式实现继承,本篇主要是在读书时遇到了原型继承的问题,回顾以下原型继承的集中方式并整理成笔记方便日后查阅。
Meteors
2021/12/08
2740
第158天:面向对象入门
在这里我们可以理解为创造对象的几种模式:单例模式,工厂模式,构造函数模式,原型模式等。
半指温柔乐
2018/09/11
3320
第158天:面向对象入门
【说站】JavaScript有哪些继承的方法
JavaScript有哪些继承的方法 1、寄生式继承,基于某个对象创建一个对象,然后增强对象,返回对象。 function create(original){     // 通过调用函数创建一个新对象     var clone = object(original);     // 以某种方式增强对象     clone.sayHi = function(){         console.log('hi')     }     return clone; } var person = {     n
很酷的站长
2022/11/24
3460
【说站】JavaScript有哪些继承的方法
JS继承机制总结
(无法实现函数复用’父类构造函数中的某个函数可能只是一个功能型的函数,它不论被复制了多少份,输出的结果或者功能都是一样的,那么这类函数是完全可以拿来复用的。但是现在用了构造函数继承,由于它是复制了父类构造函数中的属性和方法,这样产生的每个子类实例中都会有一份自己各自的方法,可是有的方法完全没有必要复制,可以用来共用的,所以就说不能够「函数复用」。)
玖柒的小窝
2021/12/08
1.6K0
JS 继承
用过 React的读者知道,经常用 extends继承 React.Component:
grain先森
2019/03/28
3K0
JS 继承
JavaScript之对象继承
该方法创建一个仅用于封装继承过程的函数,该函数在内部以某种方式来增强对象,最后再像真地是它做了所有工作一样返回对象。
laixiangran
2018/07/25
4450
相关推荐
四种继承模式详解
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验