帶著以下問題看文章:
什么是apply祝峻、call莱找,有什么區(qū)別
apply奥溺、call是用來做什么的桦卒,在哪些場景下應(yīng)用
方法定義:
call方法:call(obj,x,y,z,.....)
調(diào)用一個對象的一個方法裕偿,以另一個對象替換當(dāng)前對象
call方法可以用來代替另一個對象調(diào)用一個方法(本身無該方法,才選擇調(diào)用)嗦锐。call方法可以將一個函數(shù)的上下文從初始的對象轉(zhuǎn)成obj指向的新對象奕污。
如果沒有提供obj對象,那么Global對象被指做obj液走。
apply方法:apply(obj,[x,y,z])
應(yīng)用某一對象的一個方法碳默,用另一個對象替換當(dāng)前對象。
如果第二個參數(shù)不是一個有效的數(shù)組或者不是arguments對象缘眶,將會報錯TypeError
如果沒提供obj對象嘱根,那么Global對象被指做obj。
應(yīng)用場景:
1巷懈,函數(shù)之間的相互調(diào)用
function add(a,b){
? ? ? alert(a+b);
}
function sub(a,b){
? ? alert(a-b);
}
add.call(sub,5,6); //彈出11该抒,對象替換,等等這不是函數(shù)嗎顶燕?凑保? ?其實函數(shù)名是Function對象的引用。
思考:用apply怎么寫呢涌攻?
add.apply(sub,[5,6]); 也是彈出11欧引,從這里可以看出apply和call的參數(shù)方式是不一樣的,call的參數(shù)適合用于可明確值癣漆,且簡短的參數(shù)维咸,apply的參數(shù)適合用于數(shù)組元素較多的場景
2,構(gòu)造函數(shù)之間的調(diào)用
function Person(){
? ? ?this.age = 50;
? ? ?this.showAge= function(){
? ? ? ? ? ? alert(this.age);
? ? }
}
function Son(){
? ? this.age ?= 20;
}
var father ?= new Person();
var xiaoming = new Son();
此時 father.showAge()是正常執(zhí)行的惠爽,xiaoming.showAge()是undefined癌蓖,為啥undefined呢,屬性不存在均為undefined
xiaoming 是沒有showAge方法的婚肆,那如果想要知道xiaoming的年齡呢租副?
father.showAge.apply(xiaoming) //立即執(zhí)行顯示20
father.showAge.call(xiaoming)//立即執(zhí)行顯示20
xiaoming.showAge();報錯,會說showAge() is not a function
此時說明將方法應(yīng)用于另一個對象時用僧,僅僅是對另一個對象執(zhí)行此方法,結(jié)束之后赞咙,該對象不擁有此方法责循,
那么如果想要另一個對象也擁有這個方法呢?
還是剛剛的例子攀操,我們在Son方法中添加代碼:
function Son(){
? ? this.age ?= 20;
? ? Person.call(this);
? ?//Person.apply(this)
}
這里需要注意的是重新定義Son方法之后院仿,需給xiaoming重新賦值,不然獲取不到剛剛修改的showAge,
再執(zhí)行xiaoming.showAge(),結(jié)果顯示可以使用這個方法了歹垫,但是彈出的值是50剥汤,想想看為什么?
多重繼承
使用多個call 或者apply 即可排惨。
場景1:找出一個數(shù)組的最大值或最小值吭敢,數(shù)組值很多且不定
var arr ?= [1,2,3,.......n]
Math.min.apply(this,arr),this可隨便換暮芭,但需是一個對象
為什么不用call鹿驼?參數(shù)不定且太多,無法書寫谴麦,
場景2:var arr1= [1,2,3],arr2= [5,6,7,8]蠢沿。將arr2的值放入到arr1中
首先想到的是什么方法,contact匾效?for循環(huán) 然后push?
用apply可一行代碼解決:Arrray.prototype.push.apply(arr1,arr2)
contact方法返回的是新數(shù)組恤磷,而不是直接改變arr1的值面哼。
引入另外一個話題:數(shù)組方法哪些是改變原數(shù)組的,哪些是不會改變原數(shù)組的