之前一直对js中call的使用非常模糊,官方的解释:,“调用一个对象的一个方法,以另一个对象替换当前对象“,看了以后更加懵逼。
先用一个简单的例子感受下
function class1() {
this.name = 'class1';
this.show = function() {
alert(this.name);
}
}
function class2() {
this.name = 'class2';
}
var cs1 = new class1();
var cs2 = new class2();
cs1.show.call(cs2);
//返回
//class2
从上面的例子可以看出,call改变了class1中的this对象,将this变为了cs2,cs1.show.call(cs2)可以看成下面这段代码
function class2() {
this.name = 'class2';
this.show = function() {
alert(this.name);
}
}
var cs2 = new class2();
cs2.show();
这里就可以看出有点继承的意思了。
call的第一个参数是用来替换调用call的方法中的this对象,若方法中没有this对象,会直接忽略掉传过来的对象,这个参数可选,也可以为null或undefined。
再看下下面的代码
function class1() {
this.name = 'class1';
this.show = function() {
alert(this.name);
}
}
function class2() {
this.name = 'class2';
}
var cs2 = new class2();
class1.call(cs2);//这里将class1中的this全替换成了实例cs2
cs2.show();//返回class1
执行了class1.call(cs2)后,class2可以看成
function class2() {
this.name = 'class2';
this.name = 'class1';
this.show = function() {
alert(this.name);
}
}
可以看出class2的name属性被this.name=’class1’覆盖了。
我们再看看直接把方法作为call的参数
function class1() {
this.show = function() {
alert(this.user);
}
}
function class2() {
this.user = "wenjl";
}
function testCall() {
class1.call(class2);
alert(class2.show);//返回 function(){alert(this.user)}
alert(class2.user);//返回undefined
class2.show();//返回undefined
}
这里需要注意的是user这个属性是属于class2的实例的而不是这个类的,而class2.show有值是因为直接把show这个函数赋给了class2这个类。
我觉得个人目前很少有用到call方法,但了解这个方法对js的继承和作用域的了解还是有一定的帮助
(个人观点,烦请指正)