• 手写es5和es6实现原型继承


    组合继承(为什么叫组合继承,组合继承就是构造函数继承和原型链继承的组合)

    // 组合继承(只需要注意两点)
    // 第一点:继承father的属性值。在Children构造函数中调用Father.call(this,val) (构造函数继承)
    // 第二点:继承father的方法。let aa = new Father()之后可以aa.getVal(),让Children.prototype = aa,这样Children的实例就可以用到Father的方法了(把子类的prototype设置为父类的实例,也叫做原型链继承)
    function Father(val){
        this.val = val
        this.father = 1111
    }
    function Children(val){
        Father.call(this,val) //构造函数继承解决原型链继承的缺点:解决了原型链继承造成的引用类型被所有实例共享的问题,但是缺点是function也是引用类型,这样的话就造程了每个子实例都会有相同的方法,造成了内存浪费
    }
    Children.prototype = new Father() //原型链继承
    Father.prototype.getVal = function(payload = ''){
        console.log(this.val + payload)
    }
    let child = new Children("组合继承")
    console.log(child)

    运行出来的结果如下

     所以组合继承的缺点也是很明显,就是在继承父类函数的时候调用了父类构造函数,导致子类的原型上多了不需要的父类属性,造成了内存上的浪费

    寄生组合继承

    function Parent(value) {
      this.val = value
    }
    Parent.prototype.getValue = function() {
      console.log(this.val)
    }
    
    function Child(value) {
      Parent.call(this, value)
    }
    Child.prototype = Parent.prototype
    Parent.prototype.constructor = Child
    const child = new Child(1)
    
    child.getValue() // 1
    child instanceof Parent // true
    

    es6 class继承

    class Parent {
      constructor(value) {
        this.val = value
      }
      getValue() {
        console.log(this.val)
      }
    }
    class Child extends Parent {
      constructor(value) {
        super(value)
        this.val = value
      }
    }
    let child = new Child(1)
    child.getValue() // 1
    child instanceof Parent // true
    

    class 实现继承的核心在于使用 extends 表明继承自哪个父类,并且在子类构造函数中必须调用 super,因为这段代码可以看成 Parent.call(this, value)

    当然了,之前也说了在 JS 中并不存在类,class 的本质就是函数。

  • 相关阅读:
    2016/1/24 笔记 集合类 异常
    2016/1/22 3,将id为005的对象从集合中移除
    2016/1/22 1, 1-100 放集合 特定对象移除 2,List集合和Set集合是否可以重复添加
    2016/1/21 练习 arraylist 1,添加 add() 2,遍历集合
    2016/1/21 练习 创建 接口interface 应用implements 类class 并实例化调用
    2016/1/21 解读泛型
    2016/1/20 笔记 1, 包 引入 static 已经补充到类里 2,继承
    2016/1/20 总结构建子类对象时的顺序
    2016/1/20 继承作业
    笔记练习
  • 原文地址:https://www.cnblogs.com/gengzhen/p/15539191.html
Copyright © 2020-2023  润新知