• js的继承


    一、原型链继承

    将父类的实例作为子类的原型

    1. function Father(){
    2. this.name = 'Tony'
    3. }
    4. function Son() {}
    5. Son.prototype = new Father()
    6. let son = new Son();
    7. console.log(son.name) // Tony

    缺点:

    1. 父类所有的引用类型属性都会被所有子类共享,一个子类修改了属性值就会影响到其他子类。
    2.  子类不能给父类的构造函数传参

     二、构造函数继承

            在子类构造函数中调用父类构造函数并通过call或apply给父类传参、修改this指向。

    1. function Father(name){
    2. this.info = {
    3. name:name,
    4. job:'teacher'
    5. }
    6. this.sayName(){
    7. console.log(this.info.name)
    8. }
    9. }
    10. function Son (name){
    11. Father.call(this,name)
    12. }
    13. let s = new Son('Jerry');
    14. let s2 = new Son ('Mike');
    15. console.log(s.info.name) //Jerry
    16. console.log(s2.info.name) // Mike

            通过使用call()apply()方法,Parent构造函数在为Child的实例创建的新对象的上下文执行了,就相当于新的Child实例对象上运行了Parent()函数中的所有初始化代码,结果就是每个实例都有自己的info属性。 

     优点:

    1. 可以给父类传参
    2. 父类的引用类型不会被子类共享

    缺点:

    1. 子类不能访问父类原型上定义的方法(prototype上挂在的方法) 

    三、组合式继承

            组合式继承综合了原型链继承和构造方法继承的优点,通过原型链继承获得父类原型对象上的属性和方法。通过引用父类构造方法达到隔离子类共享属性,给父类传递参数 。

    1. function Father (name) {
    2. this.name=name
    3. }
    4. Father.prototype.sayName=function(){
    5. console.log(this.name)
    6. }
    7. function Son (name) {
    8. Father.call(this,name)
    9. }
    10. Son.prototype = new Father()
    11. //手动挂载构造起,指向自己的构造方法
    12. Son.prototype.constructor = Son
    13. let s1 = new Son('Mike')
    14. s1.sayName() // Mike
    15. let s2 = new Son('Jerry')
    16. s2.sayName() //Jerry

     优点:

    1. 父类的方法可以复用
    2. 子类可以向父类传参
    3. 父类构造函数中的引用类型数据不会被共享

    四、原型继承

            对参数对象的一种浅复制 ,当Object.create()只有一个参数时与下面代码中的Object()方法相同

    1. let student = {
    2. hobbies:['music','football','basketball']
    3. }
    4. function Object (o) {
    5. function F(){}
    6. F.prototype=o
    7. return new F()
    8. }
    9. let s1 = Object(student)
    10. s1.hobbies.push('sing')
    11. console.log(s1.hobbies) //['music', 'football', 'basketball', 'sing']
    12. let s2 = Object(student)
    13. s2.hobbies.push('dance')
    14. console.log(s2.hobbies) //['music', 'football', 'basketball', 'sing','dance']

    优点:

    1. 父类方法可复用 

    缺点:

    1. 父类的引用会被子类共享
    2. 子类不能向父类传参

    五、寄生试继承

             寄生式继承是在原型继承基础上的拓展,类似于一个工厂模式,即创建一个用于封装继承的函数,该函数内部对参数对象做了增强。

    1. function Object (person){
    2. function F () {}
    3. F.prototype = person;
    4. return new F()
    5. }
    6. function createObject(person){
    7. let obj = Object(person)
    8. obj.sayHello = function(){
    9. console.log('hello')
    10. }
    11. return obj
    12. }
    13. let person = {
    14. name:'tony',
    15. age:32
    16. }
    17. let p1 = createObject(person)
    18. p1.sayHello() //hello
    19. p1.name //tony

    六、寄生式组合继承

            组合式继承有看似完美却有一个缺点,那就是父类的构造函数会被执行两次,一次是父类实例化时,一类是子类实例化时。这样就会造成内存没必要的消耗,寄生式组合继承正是弥补了这个短板,时目前最为理想的继承方式。

    1. function extend(subClass,superClass){
    2. var prototype = object(superClass.prototype);//创建对象
    3. prototype.constructor = subClass;//增强对象
    4. subClass.prototype = prototype;//指定对象
    5. }

    七、ES6继承

    1. class supClass {
    2. constructor(name) {
    3. this.name = name
    4. }
    5. sayName(){
    6. console.log(this.name)
    7. }
    8. }
    9. class subClass extends supClass{
    10. constructor (name) {
    11. super(name)
    12. this.name = name
    13. }
    14. }
    15. let sub = new subClass ('subClass')
    16. console.log(sub.name)
    17. sub.sayName() // subClass

  • 相关阅读:
    02-Nginx安装与常用命令
    C++ break 语句
    设计模式之设计原则
    MySQL高可用之MHA集群
    SpringCloud环境搭建及入门案例
    Store:海量实用工具,让工作更加高效,更加轻松!
    3. 博弈树 (15分)
    【python】numpy常用属性
    按钮控件(Button)
    最新Java JDK 21:全面解析与新特性探讨
  • 原文地址:https://blog.csdn.net/Mahuicool/article/details/133191051