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 相关文章推荐
常用js脚本
Dec 03 Javascript
在线编辑器的实现原理(兼容IE和FireFox)
Mar 09 Javascript
Firefox outerHTML实现代码
Jun 04 Javascript
ExtJS的拖拽效果示例
Dec 09 Javascript
JavaScript及jquey实现多个数组的合并操作
Sep 06 Javascript
jQuery插件imgPreviewQs实现上传图片预览
Jan 15 Javascript
详解Javascript获取缓存和清除缓存API
May 25 Javascript
vue.js,ajax渲染页面的实例
Feb 11 Javascript
vue+axios+element ui 实现全局loading加载示例
Sep 11 Javascript
Node.js 如何利用异步提升任务处理速度
Jan 07 Javascript
js实现登录拖拽窗口
Feb 10 Javascript
Vue.js中使用Vuex实现组件数据共享案例
Jul 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之第一天
2006/10/09 PHP
多重?l件?合查?(一)
2006/10/09 PHP
操作Oracle的php类
2006/10/09 PHP
PHP 采集心得技巧
2009/05/15 PHP
php采用curl模仿登录人人网发布动态的方法
2014/11/07 PHP
YII2框架中日志的配置与使用方法实例分析
2020/03/18 PHP
求得div 下 img的src地址的js代码
2007/02/28 Javascript
ext jquery 简单比较
2010/04/07 Javascript
jQuery中验证表单提交方式及序列化表单内容的实现
2014/01/06 Javascript
js二维数组排序的简单示例代码
2014/01/24 Javascript
项目中常用的JS方法整理
2015/01/30 Javascript
在AngularJS中如何使用谷歌地图把当前位置显示出来
2016/01/25 Javascript
JQuery的Pager分页器实现代码
2016/05/03 Javascript
Vue三种常用传值示例(父传子、子传父、非父子)
2018/07/24 Javascript
vue的过滤器filter实例详解
2018/09/17 Javascript
微信小程序下拉菜单效果的实例代码
2019/05/14 Javascript
如何使用webpack打包一个库library的方法步骤
2019/12/18 Javascript
在pycharm中开发vue的方法步骤
2020/03/04 Javascript
three.js中多线程的使用及性能测试详解
2021/01/07 Javascript
python用来获得图片exif信息的库实例分析
2015/03/16 Python
Python实现简易端口扫描器代码实例
2017/03/15 Python
Python读取mat文件,并转为csv文件的实例
2018/07/04 Python
解决python彩色螺旋线绘制引发的问题
2019/11/23 Python
python enumerate内置函数用法总结
2020/01/07 Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
2020/10/16 Python
移动端Html5中百度地图的点击事件
2019/01/31 HTML / CSS
美国现代家具和家居商店:Apt2B
2016/08/29 全球购物
美国益智玩具购物网站:Fat Brain Toys
2017/11/03 全球购物
加拿大在线旅游公司:Flighthub
2019/03/11 全球购物
银行毕业实习自我鉴定
2013/09/19 职场文书
组织关系转移介绍信
2014/01/16 职场文书
2015年政府采购工作总结
2015/05/21 职场文书
永远是春天观后感
2015/06/12 职场文书
2016年小学“我们的节日·中秋节”活动总结
2016/04/05 职场文书
关于flex 上下文中自动 margin的问题(完整例子)
2021/05/20 HTML / CSS
python中24小时制转换为12小时制的方法
2021/06/18 Python