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 相关文章推荐
利用javascript的面向对象的特性实现限制试用期
Aug 04 Javascript
一个基于jquery的文本框记数器
Sep 19 Javascript
jcrop基本参数一览
Jul 16 Javascript
使用jquery animate创建平滑滚动效果(可以是到顶部、到底部或指定地方)
May 27 Javascript
JavaScript中的console.dir()函数介绍
Dec 29 Javascript
.NET微信公众号开发之创建自定义菜单
Jul 16 Javascript
js实现浏览本地文件并显示扩展名的方法
Aug 17 Javascript
jquery仿京东侧边栏导航效果
Mar 02 Javascript
详解react服务端渲染(同构)的方法
Sep 21 Javascript
jQuery实现的两种简单弹窗效果示例
Apr 18 jQuery
vue1.0和vue2.0的watch监听事件写法详解
Sep 11 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
Jan 21 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
日本十大最佳动漫,全都是二次元的神级作品
2019/10/05 日漫
单位速度在实战中的运用
2020/03/04 星际争霸
菜鸟修复电子管记
2021/03/02 无线电
dede3.1分页文字采集过滤规则详说(图文教程)续二
2007/04/03 PHP
php 无限极分类
2008/03/27 PHP
兼容性比较好的PHP生成缩略图的代码
2011/01/12 PHP
php数组保存文本与文本反编成数组实例
2014/11/13 PHP
PHP SPL标准库之数据结构堆(SplHeap)简单使用实例
2015/05/12 PHP
详解 PHP加密解密字符串函数附源码下载
2015/12/18 PHP
thinkPHP5.0框架API优化后的友好性分析
2017/03/17 PHP
超清晰的document对象详解
2007/02/27 Javascript
基于Jquery的淡入淡出的特效基础练习
2010/12/13 Javascript
推荐11款jQuery开发的复选框和单选框美化插件
2011/08/02 Javascript
深入Javascript函数、递归与闭包(执行环境、变量对象与作用域链)使用详解
2013/05/08 Javascript
深入理解javaScript中的事件驱动
2013/05/21 Javascript
当鼠标移动到图片上时跟随鼠标显示放大的图片效果
2013/06/06 Javascript
理解JavaScript表单的基础知识
2016/01/25 Javascript
通过javascript进行UTF-8编码的实现方法
2016/06/27 Javascript
利用JavaScript实现拖拽改变元素大小
2016/12/14 Javascript
jQuery实现的简单悬浮层功能完整实例
2017/01/23 Javascript
Pandas之groupby( )用法笔记小结
2019/07/23 Python
详解pandas使用drop_duplicates去除DataFrame重复项参数
2019/08/01 Python
Python合并2个字典成1个新字典的方法(9种)
2019/12/19 Python
在python3中实现查找数组中最接近与某值的元素操作
2020/02/29 Python
Python监听剪切板实现方法代码实例
2020/11/11 Python
css 元素选择器的简单实例
2016/05/23 HTML / CSS
美国最大的团购网站:Groupon
2016/07/23 全球购物
兰蔻加拿大官方网站:Lancome加拿大
2016/08/05 全球购物
幼师自荐信
2013/10/26 职场文书
学雷锋宣传标语
2014/06/25 职场文书
企业领导对照检查材料
2014/08/20 职场文书
四风问题个人剖析材料
2014/10/07 职场文书
北京天坛导游词
2015/02/12 职场文书
个人总结怎么写
2015/02/26 职场文书
Python 中的单分派泛函数你真的了解吗
2021/06/22 Python
golang 实用库gotable的具体使用
2021/07/01 Golang