原型模式
functionPerson(name,age,job){
this.name=name;
this.age=age;
this.job=job;
Person.prototype.showName=function(){
alert(this.name);
}
Person.prototype.showAge=function(){
alert(this.age);
}
Person.prototype.showJob=function(){
alert(this.job);
}
}
//先去自己的对象中找showName函数,再去构造函数的原型找
varLucy=newPerson('lucy',18,'测试鼠');
//重写自身对象中的方法,不会影响其它对象
Lucy.showName=function(){
alert('我的名字是'+this.name);
}
Lucy.showName();//我的名字是lucy
varLily=newPerson('lily',19,'市场鸡');
Lily.showName();//lily
alert(Lucy.showName==Lily.showName);//false
call和apply
call和apply的区别
二者都可以改变当前的this,区别在于apply方法要将参数放入数组中再传参
*/
functionaa(a,b){
alert('我的this是'+this+',我的a是'+a+',我的b是'+b);
}
//我的this是[object Window],我的a是2,我的b是3
//aa(2,3);
//我的this是abc,我的a是2,我的b是3
/aa.call('abc',2,3);
//我的this是abc,我的a是2,我的b是3
aa.apply('abc', [2,3]);
函数的继承
functionFclass(name,age){
this.name=name;
this.age=age;
}
Fclass.prototype.showName=function(){
alert(this.name);
}
Fclass.prototype.showAge=function(){
alert(this.age);
}
//子类
functionSclass(name,age,job){
//属性用call或者apply的方式来继承
Fclass.call(this, name, age);
this.job=job;
//方法继承:将父类的一个实例赋值给子类的原型属性
Sclass.prototype=newFclass();
Sclass.prototype.showJob=function(){
alert(this.job);
}
//由于已经继承了父类的属性和方法,所以可以直接调用
varDriver=newSclass('tom',18,'老司机');
Driver.showName();
Driver.showAge();
Driver.showJob();