首先我们要提供一个父类
function Person(name,date){
this.name=name;
this.date=date;
this.sum=function(){
console.log(this.name)
}
}
Person.prototype.age=10; //给构造函数添加原型属性
原型链继承:
function Per(){
this.name="ker"
}
Per.prototype=new Person(); //新实例的原型等于父类的实例
var per1=new Per();
console.log(per1.name); //10
console.log(per1 instanceof Person); //true
原型链可继承的属性有:实例的构造函数的属性,父类构造函数属性,父类原型的属性
缺点:1.新实例不可想父类传参,只能单方面的接受。
2.所有的新实例都公用父类属性,只要父类发生改变则都会发生改变,牵一发而动全身。
借用构造函数继承:
function Con(){
Person.call(this,"jer","12/17"); //用.call()和.apply()将父类构造函数引入子类函数(在子类函数中做了父类函数的自执行(复制))
// this.age=12
}
var con1=new Con();
console.log(con1.name);
console.log(con1.date);
console.log(con1.age); //不能继承父类原型的属性
console.log(con1 instanceof Person); //false
借用构造函数继承他只能继承父类构造函数的属性,而不能继承他的原型属性,其根本原因就是父类构造函数仅仅只是在子类函数内部复制而已。同样我们也可以利用call()和apply()来继承多个构造函数
缺点:1.只能继承父类构造函数的属性,而不能继承他的原型属性。
2.无法实现对构造函数的复用。
2.每一个新实例都要有父类的钩爪函数而显得臃肿。
组合继承
function SubType(name){
Person.call(this,name);
}
SubType.prototype=new Person(); //原型链继承
var sub = new SubType("gar");
console.log(sub.name);//"gar"继承了构造函数属性
console.log(sub.age);//10继承了父类原型的属性
组合继承顾名思义是结合了上面两种的继承的特点,同时也解决了上面两种的缺点,因此在平时也更加常用。
缺点:两次调用构造函数耗内存,
原型式继承
function content(obj){
obj.a=11
function F(){}
F.prototype=obj; //传入参数
return new F(); //返回函数对象
}
var sup=new Person();
var sup1=content(sup)
console.log(sup1.a);//11
原型式继承用一个函数包装一个对象,然后返回这个函数的调用,这个函数就变成了个可以随意增添属性的实例或对象。
缺点:1.所有实例都会继承原型上的属性。
2.无法实现复用。(新实例属性都是后面添加的)
寄生式继承