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指针指向的对象,并非继承。