对call()方法一直纠结很久,分享一下现在理解的内容。
call方法:
语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]])
定义:调用一个对象的一个方法,以另一个对象替换当前对象。
说明:
call 方法可以用来代替另一个对象调用一个方法。call 方法可将一个函数的对象上下文从初始的上下文改变为由 thisObj 指定的新对象。
如果没有提供 thisObj 参数,那么 Global 对象被用作 thisObj。
总结:call方法的主要目的就是为了改变this的上下文。
举例1:所谓的“继承性”
var a = new FriendB();
function FriendA(name){
this.name = "阿花";
this.say = function(){
console.log(this.name);
}
var a = '666';
}
function FriendB(){
console.log(this);
FriendA.call(this,'阿绿');
console.log(this);
}
输出控制台:
结果:我们可以看到结果FriendB拿到了FriendA方法的name属性和say属性,却拿不到var a = '666'的变量,也就是表示call()方法只能够拿到this所指代的属性.
举例2:方法的加载
function Animal(){
this.name = "Animal";
this.showName = function(){
alert(this.name);
}
}
function Cat(){
this.name = "Cat";
}
var animal = new Animal();
var cat = new Cat();
animal.showName.call(cat,",");
我的疑惑是:animal在调用showName()方法时,虽然当前上下文对象是cat{name:'Cat'},但是我进入Animal方法时,
this.name = "Animal"不是应该把cat{name:'Cat'}变为cat{name:'Animal'}吗?为什么输出依旧是“Cat",
后面我想了下,其实在"var animal = new Animal(); 和 var cat = new Cat();"是已经对方法及其的属性进行了初始化,比如this.name = “Animal",注意顺序,是初始化已经结束后才执行的animal.showName.call(cat,","), 此时,直接进入showName()方法,此时的this为cat{name:'Cat'}。
上述是我自己的理解,如果不对,请各位多多指正。
给一个我觉得不错的链接:http://uule.iteye.com/blog/1158829(评论才是重点)