原型与继承
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)
// 接下来就是自己的属性和方法
}
}