JavaScript中 apply/call 与面向对象语言中继承关系的联系和区别

来源:互联网 发布:洛克人网络争霸战粤语 编辑:程序博客网 时间:2024/05/21 17:03

如果对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();
    运行结果如下
    这里写图片描述
    不解释,正常调用。

结论:若父类和子类中含有同名方法,但参数个数不同,同名方法不会被重载

综上,
联系有如下三点

  1. 可以继承父类属性
  2. 可以继承父类不同名方法
  3. 若父类和子类中存在同名方法,子类方法会覆盖父类方法

区别有一点
不存在重载,及如果子类中存在与父类同名的方法,不论参数个数是否一致,子类的实例都只会调用子类中的同名方法,父类中的同名方法将被隐藏,对于子类的实例来说不可见。

0 0
原创粉丝点击