原型与继承

2019-04-13  本文已影响0人  frameworkofthin

什么是继承?

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

组合继承

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

// 定义父级构造函数
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)
    // 接下来就是自己的属性和方法
  }
}
上一篇下一篇

猜你喜欢

热点阅读