如果对apply/call还没有一个大体的概念,请参考以下资料:
http://blog.csdn.net/myhahaxiao/article/details/6952321#reply
主要问题:apply是可理解为类的继承?
1.测试属性是否被继承
function people(name,age){
//属性
this.name=name;
this.age=age;
//方法
this.show=function(){
console.log("my name is"+this.name+" and I am "+this.age+" years old");
};
}
function student(name,age,school){
people.apply(this,arguments);
this.school=school;
this.showYourself=function(){
console.log("my name is"+this.name+" and I am "+this.age+" years old"+" my school is"+ this.school);
};
}
var tom=new student('tom','19','xtu');
tom.showYourself();
程序结果
结论:属性可以正常继承
2.父类中的方法是否可以继承(暂时称呼为父类,并不准确)
调用tom.show();
方法
程序运行结果
结论:父类中的方法可以被正常继承
3.若子类中存在和父类同名的方法是否会被覆盖
在student
类中添加如下代码
this.show=function(){
console.log("hello");
};
程序运行结果
结论:当子类中存在和父类同名的方法时,子类的方法会覆盖掉父类的方法即调用的为子类的show
方法
4.若父类和子类中含有同名方法,但参数个数不同,是否会重载
将子类student
中的show
方法改成如下形式
this.show=function(school){//添加了参数school
console.log('hello '+school);
};
父类people
中的show
方法不变。如下
this.show=function(){
console.log("my name is "+this.name+" and I am "+this.age+" years old");
};
-不传入参数调用show方法tom.show();
运行结果如下
并未调用父类的无参数show
方法,因为没有传入参数,所以显示undefined。
- 传入一个参数调用show方法
tom.show();
运行结果如下
不解释,正常调用。
结论:若父类和子类中含有同名方法,但参数个数不同,同名方法不会被重载
综上,
联系有如下三点
- 可以继承父类属性
- 可以继承父类不同名方法
- 若父类和子类中存在同名方法,子类方法会覆盖父类方法
区别有一点
不存在重载,及如果子类中存在与父类同名的方法,不论参数个数是否一致,子类的实例都只会调用子类中的同名方法,父类中的同名方法将被隐藏,对于子类的实例来说不可见。