原型链继承:
<script>
function Person(){
this.name="张三"
}
Person.prototype.age=30
function Student(name){
this.name=name
}
Student.prototype=new Person()
var stu=new Student("晓明")
缺点:
1、新实例无法向父类构造函数传参。
2、继承单一。
3、所有新实例都会共享父类实例的属性。
(原型上的属性是共享的,一个实例修改了原型属性,另一个实例的原型属性也会被修改!)
构造函数继承:
function Person(name){
this.name=name
}
Person.prototype.age=30
function Son(sex){
Person.call(this,"张三")
this.sex=sex
}
var son=new Son("女")
混合继承(原型链和构造函数混合)
function Person(name){
this.name=name
}
Person.prototype.age=30
function Son(name,sex){
Person.call(this,name)
this.sex=sex
}
Son.prototype=new Person()
var son=new Son("小三",'男')
原型继承
function Person(name){
this.name=name
}
Person.prototype.age=30
function wrap(obj){
var F=function(){};
F.prototype=obj
return new F()
}
var per=new Person("张三")
var son=wrap(per)
寄生式继承
function Person(name){
this.name=name
}
Person.prototype.age=30
function wrap(obj){
var F=function(){};
F.prototype=obj
return new F()
}
var per=new Person("张三")
function son(sex){
var sonobj=wrap(per)
sonobj.sex=sex
return sonobj
}
var son1=son("男")
寄生组合式继承:
function Person(name){
this.name=name
}
Person.prototype.age=30
//定义一个函数 包装父函数的对象
function wrap(obj){
//定义空函数
var F=function(){};
//将obj挂载到F的原型上
F.prototype=obj
//返回的是F的实例
return new F()
}
//调用wrap
var son=wrap(Person.prototype)
//组合
function Sub(name){
Person.call(this,name)
}
//将包装好的son挂载到Sub的原型上
Sub.prototype=son
var obj=new Sub('xiaosi')
//修复实例
</script>