一、原型链继承
function Father(name,age) {
this.name = name;
this.age = age;
this.input = function(){
console.log(this.name,this.age)
}
}
function Son(){
}
Son.prototype = new Father("张三",18)//继承父类属性及方法
var son = new Son()
console.log(son.name)//张三
console.log(son.age)//18
son.input();//张三,18
son.name = "李四",
son.age = "20"
son.input()//李四,20
优点:能通过instanceOf和isPrototypeOf的检测
注意:给原型添加方法的语句一定要放在原型替换Son.prototype = new Father();之后
缺点:(1)Father中的属性(不是方法)也变成了Son的prototype中的公用属性,
(2)创建子类型的时候,不能像父类型的构造函数中传递参数。
二、构造函数继承
function Father(name,age){
this.name = name;
this.age = age;
this.input = function(){
console.log(this.name,this.age)
}
}
function Son(){
//继承Father
Father.call(this,"张三",18)
}
var son = new Son()
son.input();
原理:在子类型构造函数的内部调用超类型构造函数
优点:解决了superType中的私有属性变公有的问题,可以传递参数
缺点:方法在函数中定义,无法得到复用
三:寄生组合继承(最理想):
function inheritPrototype(subType, superType){
var prototype = object(superType.prototype); //创建对象
prototype.constructor = subType; //增强对象
subType.prototype = prototype; //指定对象
}
function SuperType(name){
this.name = name;
this.colors = ["red", "blue", "green"];
}
SuperType.prototype.sayName = function(){
alert(this.name);
};
function SubType(name, age){
SuperType.call(this, name);
this.age = age;
}
inheritPrototype(SubType, SuperType);//实现继承
SubType.prototype.sayAge = function(){
alert(this.age);