JS继承最简单的理解方式


Posted in Javascript onMarch 31, 2021

我们可以简单的分为以下几种继承方式

  1. 原型链继承
  2. 构造函数继承
  3. 组合继承
  4. 寄生组合继承/加强版寄生组合继承
  5. 类继承

以下 A代表父级 B代表子级

我们先看原型链继承
先上代码

function A(name,age){
              this.name = name;
              this.arr = [];
              this.age = age;
              this.sing = function(){
                  return  '我会唱歌、我会跳舞。'
              }
          }
          function B(run){
              this.run = run
          }
          B.prototype = new A('zjq',18)
          console.log(new B()._proto_ === A.construct)
          let a = new B('123')
          let b = new B('456')
          a.arr.push('1')
          console.log(b.arr)  //['1']

B已经完全的集成到了A的属性和方法,但是有一个缺点就是当我们实例化两个B的时候,给第一个arr添加item,第二个实例化对象也会跟着变化。a和b的arr都新添了一个item。方法变成了共享,不是实例所私有的。(引用类型)

构造函数继承
上代码

function A(name,age){
              this.name = name;
              this.age = age;
              this.arr =[];
              this.sing = function(){
                  return  '我会唱歌、我会跳舞。'
              }
          }
          A.prototype.zjq = function(){
            return 'run'
        }
          function B(run){
              this.run = run
              A.call(this,'zjq',this.run) //父级的属性和方法称为子级的私有属性和方法  子级可以向父级传参
          }
          let Bobj = new B('runing')
          console.log(Bobj)
          console.log(Bobj.sing())
          let a = new B('123')
          let b = new B('456')
          a.arr.push('1')
          console.log(b.arr)  //[]

构造函数继承虽然可以使用A中的方法和属性,但是不是继承的关系过来的,它的_proto_上没有A的任何信息,它将A的属性和方法变成了自己的属性和方法,但是原型链上的方法(zjq方法并没有)是无法继承到的。创建子类实例,可以向父类构造函数传参数。解决了方法变成了共享的问题,变成了实例所私有的。

组合继承
上代码

function A(name, age) {
            this.name = name;
            this.age = age;
            this.arr=[]
        }
        A.prototype.sing = function () {
            return '我会唱歌、我会跳舞。' + this.name + this.age
        }
        function B(run) {
            this.run = run
            A.call(this, 'zjq', this.run) //父级的属性和方法称为子级的私有属性和方法  子级可以向父级传参
        }
        B.prototype = new A()
        let brr = new B('参数')
        let a = new B('123')
        let b = new B('456')
        a.arr.push('1')
        console.log(b.arr)  //[]
        console.log(brr)
        console.log(brr.sing())
        console.log(brr.age)

结合原型链继承和借用构造函数继承的优点 ,继承了A的属性和方法也可以向A传递自己的参数。解决了方法变成了共享的问题,变成了实例所私有的,但是A构造函数被调用了两次。

寄生组合继承
上代码

function A(name, age) {
            this.name = name;
            this.age = age;
            this.arr = []
        }
        A.prototype.sing = function () {
            return '我会唱歌、我会跳舞。' + this.name + this.age
        }
        function B(run) {
            this.run = run
            A.call(this, 'zjq', this.run)
        }
        B.prototype = A.prototype
        // let b= new B('123')
        // console.log(b)
        B.prototype.sing = function () {
            return 'xxx'
        }
        let a = new B('123')
        let b = new B('456')
        a.arr.push('1')
        console.log(b.arr)  //[]
        console.log(new A().sing())  //变成了xxx  而不是 return '我会唱歌、我会跳舞。' + this.name + this.age

解决了方法变成了共享的问题,变成了实例所私有的,但是又有一个突出的问题,B可以改变原型链上的东西,A和B共享了原型链。

加强版寄生组合继承

function A(name, age) {
            this.name = name;
            this.age = age;
        }
           A.prototype.sing = function () {
            return '我会唱歌、我会跳舞。' + this.name + this.age
        }
        function B(run) {
            this.run = run
            A.call(this, 'zjq', this.run) 
        }
        function f(){}
        f.prototype = A.prototype
        B.prototype = new f()
        let b= new B('123')
        console.log(b)
        B.prototype.sing = function(){
            return 'xxx'
        }
        console.log(new A().sing()) //return '我会唱歌、我会跳舞。' + this.name + this.age

解决了共享原型链的问题。 完美收官。

类继承
上代码

class A {//父级构造函数
            constructor(name) {
                this.name = name;
            }
            sing() {
                return this.name + 'xxx'
            }
        }

        class B extends A { //子级继承父级
            constructor(name,age) {
                super(name)  调用实现父类的构造函数  并传递参数
                this.age = age
            }
        }
        let b = new B(12333,222) //实例化子级
        console.log(b)
        console.log(b.sing()) //return this.name + 'xxx'

 

Javascript 相关文章推荐
自写的一个jQuery圆角插件
Oct 26 Javascript
Jquery 类网页微信二维码图块滚动效果具体实现
Oct 14 Javascript
深入分析javascript中的错误处理机制
Jul 17 Javascript
使用JQuery中的trim()方法去掉前后空格
Sep 16 Javascript
详解AngularJS之$window窗口对象
Jan 17 Javascript
微信小程序实现笑脸评分功能
Nov 03 Javascript
详解微信小程序回到顶部的两种方式
May 09 Javascript
微信小程序实现的picker多级联动功能示例
May 23 Javascript
微信小程序接入腾讯云验证码的方法步骤
Jan 07 Javascript
Vue为什么要谨慎使用$attrs与$listeners
Aug 27 Javascript
javascript实现数字时钟效果
Feb 06 Javascript
JavaScript 去重和重复次数统计
Mar 31 Javascript
javaScript Array api梳理
Mar 31 #Javascript
抖音短视频(douyin)去水印工具的实现代码
Nest.js参数校验和自定义返回数据格式详解
Mar 29 #Javascript
Angular CLI发布路径的配置项浅析
Mar 29 #Javascript
vue中data改变后让视图同步更新的方法
vue3如何优雅的实现移动端登录注册模块
开发一个封装iframe的vue组件
You might like
php图片验证码代码
2008/03/27 PHP
php使用PDO方法详解
2014/12/27 PHP
PHP使用php-resque库配合Redis实现MQ消息队列的教程
2016/06/29 PHP
php 的多进程操作实践案例分析
2020/02/28 PHP
jQuery 表单验证插件formValidation实现个性化错误提示
2009/06/23 Javascript
checkbox全选/取消全选以及checkbox遍历jQuery实现代码
2009/12/02 Javascript
js变量以及其作用域详解
2020/07/18 Javascript
利用JQuery动画制作滑动菜单项效果实现步骤及代码
2013/02/07 Javascript
JS中批量给元素绑定事件过程中的相关问题使用闭包解决
2013/04/15 Javascript
js为数字添加逗号并格式化数字的代码
2013/08/23 Javascript
JavaScript的面向对象编程基础
2015/08/13 Javascript
jQuery实现的AJAX简单弹出层效果代码
2015/11/26 Javascript
提升jQuery的性能需要做好七件事
2016/01/11 Javascript
ECharts仪表盘实例代码(附源码下载)
2016/02/18 Javascript
JavaScript中误用/g导致的正则test()无法正确重复执行的解决方案
2016/07/27 Javascript
jquery弹出框插件jquery.ui.dialog用法分析
2016/08/20 Javascript
Node.js与MySQL交互操作及其注意事项
2016/10/05 Javascript
node.js Sequelize实现单实例字段或批量自增、自减
2016/12/08 Javascript
jQuery弹出层插件popShow用法示例
2017/01/23 Javascript
引入JavaScript时alert弹出框显示中文乱码问题
2017/09/16 Javascript
JavaScript 中的 this 简单规则
2017/09/19 Javascript
elementUI中Table表格问题的解决方法
2018/12/04 Javascript
用JavaScript实现贪吃蛇游戏
2020/10/23 Javascript
Python编写简单的HTML页面合并脚本
2016/07/11 Python
Python基于回溯法子集树模板实现8皇后问题
2017/09/01 Python
Python实现查看系统启动项功能示例
2018/05/10 Python
基于pytorch的lstm参数使用详解
2020/01/14 Python
Python装饰器的应用场景代码总结
2020/04/10 Python
Nuts.com:优质散装,批发坚果、干果和巧克力等
2017/03/21 全球购物
数控专业应届生求职信
2013/11/27 职场文书
求职信范文英文版
2014/01/05 职场文书
户外活动策划方案
2014/03/12 职场文书
银行业务授权委托书
2014/10/10 职场文书
2014年服务员工作总结
2014/11/18 职场文书
孝老爱亲事迹材料
2014/12/24 职场文书
采购内勤岗位职责
2015/04/13 职场文书