javascript中的call方法

该方法应用于function对象(即function本身或者通过new关键字创建的function实例)

该方法的第一个用途是调用一个对象的一个方法(非常的干巴巴是不是?官方解释往往都不说人话,看下面的例子即可):

function add(a,b){
        document.write(a + b);
}
function sub(a,b){
        document.write(a - b);
}
add.call(sub,3,1);

页面输出结果为:4
所以到这儿可有这样的总结:call方法可以由函数A来调用,调用之后传入若干参数,第一个参数为函数B,第二、三个参数为函数要执行时的参数,call方法执行的结果是函数A替换掉函数B的函数体内容,所以上面的例子执行了相加的运算而不是相减的
这个功能用来干什么?感觉好废的样子有没有?莫慌,有意思的在下面

function Class1(){
        this.name = "Sam";
        this.showName = function(){
                alert(this.name);        
        }
}
function Class2(){
        this.name = "Jack";        
}

然后创建一个Class1的实例

var c1 = new Class1();
c1.showName();

页面输出"Sam",没有任何问题
然后再创建一个Class2的实例

var c2 = new Class2();
c1.showName.call(c2);

页面输出"Jack"
这个结果貌似有点惊悚,Class2的实例居然可以通过一个call方法调用Class1的私有方法,不过惊悚过后有没有觉得这个功能和某个javascript里面没有但在其它编程语言中很重要的一个功能很像?
接着往下看

function Class1(){
        this.sayHi = function(txt){
                alert(txt);
        }        
}
function Class2(){
        Class1.call(this);        
}

然后创建一个Class1的实例

var c1 = new Class1();
c1.sayHi("hello,Jack");

页面输出"hello,Jack",没有任何问题
然后再创建一个Class2的实例

var c2 = new Class2();
c2.sayHi("hello,Sam");

页面输出"hello,Sam"
代码写到这里,"继承"这个词已经浮出水面,在Class2中加了一句Class1.call(this)就使Class2继承了Class1的属性和方法,javascript就是靠call方法来模拟继承的概念
Class1.call(this);这句代码中的this即是指当前对象就是Class1本身,Class1.call即是用Class1的对象代替当前的Class2对象(网上有的文章叫“对象冒充”),所以Class2的实例拥有了Class1的属性和方法
需要说明的是,我觉得用“替换”这个词不准确,如果Class2同时还拥有自已的属性和方法,那这些属性和方法肯定也是一直存在的,如果用“替换”会让人想到把Class2本身的属性和方法干掉,但暂时想不到更合适的描述,姑且先这样记着
这是最基本的继承,javascript里的继承可不可以更酷一点?看下面代码

function Class1(){
        this.sayHi = function(){
                alert("hello,world");        
        }        
}
function Class2(){
        Class1.call(this);        
}
function Class3(){
        Class2.call(this);        
}

然后创建一个Class3的实例

var c3 = new Class3();
c3.sayHi();

页面居然输出了"hello,world"!
这样,通过call方法,javascript还实现了江湖上失传已久的多重继承。

posted on 2015-03-02 16:42  real秦川  阅读(498)  评论(0编辑  收藏  举报