构造函数继承
只会继承构造函数本身的属性方法,不会继承原型中的。
var Parent=function(){
this.name='名字',
this.func=function(){
alert('方法')
}
}
Parent.prototype={
getName:function(){
alert(this.name)
}
}
var Child=function(){
Parent.call(this)//call和apply都可以
}
// 相当于吧父类当成一个函数在子类中运行,并且改变this为子类实例,这样就相当于拷贝了 父类中构造函数中的属性和方法,实现构造函数继承,但是无法继承原型中的方法和属性
var child=new Child()
console.log(child)
原型链继承
原型和实例都可以继承,就是子类和父类共享一个原型
var Parent=function(){
this.name='名字',
this.age=25,
this.func=function(){
alert('方法')
}
}
Parent.prototype={
getName:function(){
alert(this.name)
}
}
var Child=function(){
this.childName='子名字'
}
Child.prototype=new Parent()
var child=new Child()
console.log(child)
// 利用js原型链的特点将子类的原型等于父类的实例,那么子类在原型链访问过程中就可以访 问到父类的属性和方法,问题,多个实例共享一个原型
组合继承 借用构造函数 + 原型式继承
var Parent=function(){
this.name='名字',
this.age=25,
this.func=function(){
alert('方法')
}
}
Parent.prototype={
getName:function(){
alert(this.name)
}
}
var Child=function(){
Parent.call(this)
}
Child.prototype=Parent.prototype
var child=new Child()
console.log(child)
class继承
class Parent {
constructor(name){
this.name="父类名字"
}
parentFunc(){
alert(`${this.name}-parentFunc`)
}
}
//使⽤extends即可实现继承,更加符合经典⾯向对象语⾔的写法
class Child extends Parent {
constructor(name){
super(name)//⼦类的constructor⼀定要执⾏super(),以调⽤⽗类的constructor
this.name=name
this.age=24
}
childFunc(){
alert(`${this.name}-childFunc`)
}
}
const child=new Child("名字")
console.log(child)