存在即合理,首先了解下call
和apply
存在的作用返劲。
JS中函數(shù)存在 定義時上下文 和 運行時上下文赛不,并且上文是可以動態(tài)改變的疗垛。
call
和apply
都是為了改變函數(shù)運行時的context
(即上下文)而存在的。
換句話說宾肺,就是為了改變函數(shù)體內(nèi)部this
的指向溯饵。
定義一個寵物對象,其擁有words
屬性和say
函數(shù):
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"
二者作用一樣啄巧,唯一的區(qū)別是接收參數(shù)的形式不一樣:
obj.call(thisObj, arg1, arg2, ...) //接受的是連續(xù)參數(shù)。
obj.apply(thisObj, [arg1, arg2, ...]) //接受的是數(shù)組參數(shù)
通過call
和apply
掌栅,可以實現(xiàn)對象的繼承:
var parent = function{
this.name = 'pjx'
this.sex = 'boy'
}
var child = {};
console.log(child);//{}
parent.call(child);
console.log(child); //{name: "pjx", sex: 'boy'}