• 对象的继承


    一、原型继承 

      缺点:1、不能给父级构造函数传参

         2、父级构造函数中引用类型的数据,会被自己构造函数实例共享

      ps:这是下面实例中的2只猫,是不是萌萌哒!

           这是小7         这是8哥

    function Animal(name,age) {
      this.name = name
      this.age = age
      this.hobby = ['music','dance']
    }
    
    Animal.prototype.say = function() {
      return this.hobby
    }
    function Cat(color) {
      this.color = color
    }
    Cat.prototype = new Animal('八哥','1')
    
    var cat1 = new Cat('白色')
    cat1.hobby.push('sleep')
    var cat2 = new Cat('花色')
    
    console.log(111,cat1.say()) //["music", "dance", "sleep"]
    console.log(2222,cat2.say()) //["music", "dance", "sleep"]
    console.log(333,cat1.name) //八哥
    console.log(444,cat1.age) //1
    console.log(555,cat1.color) //白色

    二、借用构造函数继承

      缺点:无法继承原型中的方法

    function Animal(name) {
      this.name = name
      this.hobby = ['music','dance']
    }
    
    Animal.prototype.say = function() {
      return this.hobby
    }
    function Cat(color,name) {
      this.color = color
      Animal.call(this,name)
    }
    
    var cat1 = new Cat('白色','8哥')
    cat1.hobby.push('sleep')
    var cat2 = new Cat('花色','小七')
    
    //console.log(111,cat1.say()) //报错 cat1.say is not a function
    console.log(333,cat1.name) //八哥
    console.log(444,cat1.color) //白色
    console.log(555,cat2.name) //小七
    console.log(666,cat2.color) //花色

    三、组合继承

      完美的解决了前面2种方式造成的缺陷,但是我们会发现构造函数的属性会有冗余

    function Animal(name) {
      this.name = name
      this.hobby = ['music','dance']
    }
    
    Animal.prototype.say = function() {
      return this.hobby
    }
    
    function Cat(color,name) {
      this.color = color
      Animal.call(this,name)
    }
    
    Cat.prototype = new Animal('66')
    
    var cat1 = new Cat('白色','8哥')
    cat1.hobby.push('sleep')
    var cat2 = new Cat('花色','小七')
    
    console.log(111,cat1.say()) //["music", "dance", "sleep"]
    console.log(222,cat2.say()) //["music", "dance"]
    console.log(333,cat1.name) //八哥
    console.log(444,cat1.color) //白色
    console.log(555,cat2.name) //小七
    console.log(666,cat2.color) //花色

    四、升级一下

    function Animal(name) {
    this.name = name
    this.hobby = ['music','dance']
    }

    Animal.prototype.say = function() {
    return this.hobby
    }

    function Cat(color,name) {
    this.color = color
    Animal.call(this,name)
    }

    Cat.prototype = Animal.prototype

    var cat1 = new Cat('白色','8哥')

    console.log(111,cat1 instanceof Cat)//true
    console.log(222,cat1 instanceof Animal)//true
    console.log(333,cat1.constructor)//Animal
     
    我们会发现,判断实例的构造函数打印出来的跟我们预期不符
     
    优化
    function Animal(name) {
    this.name = name
    this.hobby = ['music','dance']
    }

    Animal.prototype.say = function() {
    return this.hobby
    }

    function Cat(color,name) {
    this.color = color
    Animal.call(this,name)
    }

    Cat.prototype = Object.create(Animal.prototype) 
    Cat.prototype.constructor = Cat
    var cat1 = new Cat('白色','8哥')

    console.log(111,cat1 instanceof Cat)//true
    console.log(222,cat1 instanceof Animal)//true
    console.log(333,cat1.constructor)//Cat
  • 相关阅读:
    Maven入门指南12:将项目发布到私服
    Groovy学习:第四章 Groovy特性深入
    jQuery部分疑问及小结
    Windows自动化---模拟鼠标键盘
    适配器
    object都有string
    spinner
    context
    OnclickListener
    学习-----领进门,看个人
  • 原文地址:https://www.cnblogs.com/woniubushinide/p/11270141.html
Copyright © 2020-2023  润新知