call()和apply()方法
1.方法定义
说明: call和apply方法使用一个指定的this值和若干个指定的参数值的前提下调用某个函数或方法。
call和apply两个方法其作用基本相同,但是也略微有一些区别。
比如call的语法
call([thisObj[,arg1[, arg2[, [,.argN]]]]])
而apply的语法
apply([thisObj[,argArray]])
其实也就是传递参数不同 , call和apply第一个参数为 ** 执行函数内部的指针引用对象 ** 或者this,上下文什么的。
第二个参数就有点区别了 , call传入的参数是一个个分别传入 ,而apply是将参数以一个数组形式传入。
2.实例
var test = {
a: 10,
b: 20,
sum: function(){
return this.a + this.b
}
};
var test2 = {
a: 100,
b: 200
}
上面两个对象,我想让test2也拥有test的sum方法该怎么办呢, 给test2增加一个sum方法? 那等于又歇了重复的代码, 这自然是不够优雅
这个时候我们就可以用到call()方法了
test.sum.call(test2) // => 300
是不是很方便,这可以让我们在很多时候节省很多时间, 不必要的重复写相同的代码,那么下面来说一个复杂点的
function Animal(type, legs) {
this.type = type;
this.legs = legs;
this.logInfo = function() {
console.log(this === myCat); // => false
}
}
var myCat = new Animal('Cat', 4);
setTimeout(myCat.logInfo, 1000);
上面的代码 , 我们创建了一个Animal的构造函数并创造它的实例了myCat,然后再定时器里1秒后调用logInfo的方法
但是结果并不是我们想象中的那样,为什么呢,因为在logInfo这个方法在作为参数传递给setTimeout时已经从原对象上分离了,所以1秒后发生的 是一个函数调用。
那么这个logInfo作为函数调用的时候 , 它的this是全局对象,浏览器环境下也就是window,严格模式下是undefined,反正就不是myCat;
setTimeout(myCat.logInfo.call(myCat), 1000); // => true
这样,我们就把logInfo方法的this 又指回myCat了,得到的也就是我们想要的结果。
继承也就如上面的例子一样。