定义继承有哪些方式
1.原型链继承
function Father(){
this.color=["red","blue"]
}
function Son(){
}
Son.prototype=new Father()
var s1=new Son()
var s2=new Son()
s1.color.push("green")
console.log(s1.color)
console.log(s2.color)
优点:可以复用父类下的属性和方法
缺点:不能给父类的变量传值,属性被孩子共享,一个改变全部改变
2.构造函数继承
function Father(name){
this.color=["red","blue"]
this.name=name
}
function Son(name){
Father.call(this,name)
}
var s1=new Son()
var s2=new Son()
s1.color.push("green")
console.log(s1.color)
console.log(s2.color)
优点:父类下的数据不被共享,子类可以借助父类构造器赋值
缺点:无法实现代码复用,每一个孩子赋值父类的副本
3.组合继承
function Father(name){
this.name=name//借用的
}
function Son(name){
Father.call(this,name)
}
Father.prototype.color=["red","blue"]//共享的
Son.prototype=new Father()
优点:既可以找到原型上的属性和方法继承,又可以给父类进行传参
缺点:每创建一个新对象,多次调用父类构造器,会在内存中生成多个,浪费资源
4.原型模式继承
var Father={color:["red","blue"]}
function person(obj){
function F(){}
F.prototype=obj
return new F()
}
var s1=person(Father)
var s2=person(Father)
s1.color.push("green")
console.log(s1.color)
console.log(s2.color)
优点:可以复用父类下的属性和方法
缺点:不能给父类变量传值,属性被孩子对象所共享,一个改变全部改变
5.寄生继承模式
var Father={color:["red","blue"]}
function person(obj){
function F(){}
F.prototype=obj
var f=new F()
f.say=function(){ console.log(this.color) }
return f
}
var s1=person(Father)
优点:可以复用父类下的属性和方法,是原型模式的增强版,可以自己新增属性和方法
缺点:不能给父类变量传值,属性被孩子对象所共享,一个改变全部改变
6.寄生组合继承(最好,无缺点)
function Father(name){
this.name=name
}
Father.prototype.color=["red","blue"]
function Son(name){
Father.call(this,name)
}
function fun(son,father){
son.prototype=Object.create(Father.prototype)
son.prototype.constructor=son
}
fun(Son,Father)
var s1=new Son("asd")
var s2=new Son("zsx")
s1.color.push("green")
console.log(s1.color)
console.log(s2.color)
优点:可以借助父类构造器,可以共享原型上的数据,可以创建不同实例对象,可以实现深拷贝,解决了资源浪费