由于博客原因,复制代码请把所有空格删掉,否则部分代码会抛出异常。
 

Javascript/JQuery call/apply

call与apply使用方法一样,不同在于除了第一个值是指向对象外,其他参数的数据类型不同。

call(obj,arg1,arg2,arg3);

apply(obj,[arg1,arg2,arg3]);


在下面例子使用call()


例子:

function a(){

    this.aa = 'inaa';

}


a.prototype.inb = function(){

    this.aa = 'inb';

}


function b(){

    console.log(this.aa);

}


b();


因为b()没有定义this.aa,所以如果直接调用的话会undefined:



如果想要在执行b()的时候能够获取到a()里面的变量和方法,就需要使用call()

as = new a();

b.call(as);

结果:


PS:在外部使用的时候需要选创建“被call()的方法的实例”,然后将这个实例作为参数使用。


另一种方法可以不创建实例,就是直接调用a(),然后在a()里面调b()。修改a()的代码,其他不变:

function a(){

    this.aa = 'inaa';

    b.call(this);

}

结果:


因为扩展方法inb()使用prototype,在调用时必须创建父类的实例。所以b()只获取到this.aa。该方法请视情况使用。


优化后代码:

function a(){

    this.aa = 'inaa';

    b.call(this);

}


a.prototype.inb = function(){

    this.aa = 'inb';

}


function b(){

    console.log(this.aa);

    this.inb();

    console.log(this.aa);

}


function c(){

    var as = new a();

}

c();

结果:



PS:call()只是修改this指针指向的对象,并非继承。

查看全文
 
评论
 
上一篇
下一篇
© 我的部落|Powered by LOFTER