//人类
function Person(name,age){
this.name=name;
this.age=age;
}
Person.prototype.run=function(){
console.log(this.name+"正在散步");
}
//领导类
//1,原型链继承:将原型改成对应的对象(缺点:无法初始化对应的属性)
function Leader(name,age){
}
Leader.prototype=new Person("人",48);
var l1=new Leader("领导",46);
l1.run(); //(人)正在散步
//教师类
//2,冒充继承:通过call或者apply改变原有函数的this指向(缺点:无法将原型中的属性和方法继承过来)
function Teacher(name,age){
Person.call(this,name,age);
//Person.apply(this,[name,age]);
}
var t1=new Teacher("教师",30);
console.log(t1.name); //教师
t1.run(); //报错:t1.run is not a function
call 和 apply 的相同点和区别
相同点:都是改变原有函数的this指向
不同点:传入参数形式不同,
call 以逗号隔开 .call(对象,参数1,参数2,参数3)。
apply 以数组的形式 .apply(对象,【参数1,参数2,参数3】)
apply 的另一种用法,把以数组形式的参数变为以逗号隔开的形式
var arr=[1,5,3,7,8,4];
var result=Math.max(arr) //错误写法 ,报错 var result=Math.max(1,5,3,7,8,4)
var result2=Math.max.apply(null,arr) //8
//学生类
//3,组合继承:原型链继承+冒充继承
function Student(name,age){
Person.call(this,name,age);
//Person.apply(this,[name,age]);
}
Student.prototype=new Person();
var s1=new Student("学生",20);
s1.run(); //(学生)正在散步