美文网首页
原型与继承

原型与继承

作者: frameworkofthin | 来源:发表于2019-04-13 14:53 被阅读0次

    什么是继承?

    继承父级的属性和方法和共享(原型链)的属性和方法

    组合继承

    通过原型链继承共享的方法和属性;通过构造函数继承父级的方法和属性

    // 定义父级构造函数
    function Parent (name) {
      this.name = name
    }
    // 定义一个原型上的方法(并不是属性中的方法)
    Parent.prototype.say = function() {
      console.log(this.name)
    }
    // 执行Parent构造函数,并将this执行Son,继承父级的属性和方法
    function Son(name) {
      Parent.call(this, name)
    }
    // 将Son的原型指向Parent实例,获取共享的属性和方法
    Son.prototype = new Parent()
    
    let tom = new Son()
    

    上面的方法有个缺点:Son的原型上有多余的name字段(Son.prototype = new Parent(),导致了this.name这个字段是多余的,this.name的值为undefine是因为new的时候没给值)

    寄生继承

    // 定义父级构造函数
    function Parent (name) {
      this.name = name
    }
    // 定义一个原型上的方法(并不是属性中的方法)
    Parent.prototype.say = function() {
      console.log(this.name)
    }
    // 执行Parent构造函数,并将this执行Son,继承父级的属性和方法
    function Son(name) {
      Parent.call(this, name)
    }
    // 注意:以下开始不同于组合继承
    // 将Son的原型指向Parent的原型,并设置constructor的值为子类构造函数(为了让使用instanceof时,能得到正确的类)且不可被遍历
    Son.prototype = Object.create(Parent.prototype, {
      constructor: {
        value: Son,
        enumerable: false,
        writable: true,
        configurable: true
      }
    })
    
    let tom = new Son()
    

    calss继承

    class Parent {
      constructor (name) {
        this.name = name
      }
    
      say () {
        console.log(this.name)
      }
    }
    
    class Son extends Parent {
      constructor (name) {
        super(name)
        // 接下来就是自己的属性和方法
      }
    }
    

    相关文章

      网友评论

          本文标题:原型与继承

          本文链接:https://www.haomeiwen.com/subject/wjpmuqtx.html