存在即合理,首先了解下call
和apply
存在的作用。
JS中函数存在 定义时上下文 和 运行时上下文,并且上文是可以动态改变的。
call
和apply
都是为了改变函数运行时的context
(即上下文)而存在的。
换句话说,就是为了改变函数体内部this
的指向。
定义一个宠物对象,其拥有words
属性和say
函数:
var pet = {
words:'...',
say:function(){
console.log('Say:' + this.words)
}
}
pet.say() //"Say: ..."
每个宠物有不同的叫声,如果我们定义一个对象:
var cat = {
words:'miao'
}
在不重写say
方法的条件下,我们希望通过pet
对象使它能拥有自己的叫声miao
,只需要利用call
或者apply
改变pet
里面的this
的指向,将this
指向cat
即可:
pet.say.call(cat) //"Say:miao"
pet.say.apply(cat) //"Say:miao"
二者作用一样,唯一的区别是接收参数的形式不一样:
obj.call(thisObj, arg1, arg2, ...) //接受的是连续参数。
obj.apply(thisObj, [arg1, arg2, ...]) //接受的是数组参数
通过call
和apply
,可以实现对象的继承:
var parent = function{
this.name = 'pjx'
this.sex = 'boy'
}
var child = {};
console.log(child);//{}
parent.call(child);
console.log(child); //{name: "pjx", sex: 'boy'}
网友评论