js中call()和apply()改變指針問題的講解
1. 每個(gè)函數(shù)都包含兩個(gè)非繼承而來的方法:call()方法和apply()方法。(天生的)
2. 相同點(diǎn):這兩個(gè)方法的作用是一樣的。
都是在特定的作用域中調(diào)用函數(shù),等于設(shè)置函數(shù)體內(nèi)this對象的值,以擴(kuò)充函數(shù)賴以運(yùn)行的作用域。
一般來說,this總是指向調(diào)用某個(gè)方法的對象,但是使用call()和apply()方法時(shí),就會改變this的指向。
call有兩個(gè)妙用:
- 1: 繼承。
- 2: 修改函數(shù)運(yùn)行時(shí)的this指針。
區(qū)別:call和apply的區(qū)別在于call的第二個(gè)參數(shù)可以是任意類型,而apply的第二個(gè)參數(shù)必須是數(shù)組或者arguments
<script> //一般來說,this總是指向調(diào)用某個(gè)方法的對象,但是使用call()和apply()方法時(shí),就會改變this的指向。 /* call方法: 語法:call(thisObj,arg1,arg2,……,argN) 定義:調(diào)用一個(gè)對象的一個(gè)方法,以另一個(gè)對象替換當(dāng)前對象 參數(shù) thisObj;可選項(xiàng),將被用作當(dāng)前對象的對象 arg1,arg2,……,argN;可選項(xiàng),將被傳遞方法參數(shù)序列 說明 call方法可以用來代替另一個(gè)對象調(diào)用一個(gè)方法。call方法可將一個(gè)函數(shù)的對象上下文從初始的上下文改變?yōu)橛衪hisObj指定的新對象。 如果沒有提供thisObj參數(shù),那么Global對象被用作thisObj */ /* apply方法: 語法:apply(thisObj,[arg1,arg2,……,argN]) 定義:應(yīng)用某一個(gè)對象的一個(gè)方法,用另一個(gè)對象替換當(dāng)前對象 */ //區(qū)別:call和apply的區(qū)別在于call的第二個(gè)參數(shù)可以是任意類型,而apply的第二個(gè)參數(shù)必須是數(shù)組或者arguments //1. function add(a,b) { console.log(a+b); } function sub(a,b) { console.log(a-b); } add.call(sub,3,1);//用add來替換sub,add.call(sub,3,1)==add(3,1),結(jié)果是console.log(4); //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); // 通過call或者apply方法,將原本屬于Animal對象的showName()方法交給對象cat來使用。結(jié)果為alert("Cat"); //3. function Animal(name){ this.name=name; this.showName=function(){ alert(this.name); } } function Cat(name){ Animal.call(this,name); } var cat=new Cat("Black Cat"); cat.showName(); //Animal.call(this)的意思是使用Animal對象代替this對象,那么Cat中就有了Animal的所有方法和屬性了,Cat對象就能直接調(diào)用Animal的方法和屬性了。 //4. function Class10(){ this.showSub=function(a,b){ alert(a-b); } } function Class11(){ this.showAdd=function(a,b){ alert(a+b); } } function Class2(){ Class10.call(this); Class11.call(this); } //使用兩個(gè)call就實(shí)現(xiàn)多繼承了。 </script>
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請查看下面相關(guān)鏈接
相關(guān)文章
js實(shí)現(xiàn)簡單的倒計(jì)時(shí)
這篇文章主要為大家詳細(xì)介紹了js實(shí)現(xiàn)簡單的倒計(jì)時(shí),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01js實(shí)現(xiàn)圖片推拉門效果代碼實(shí)例
這篇文章主要介紹了js實(shí)現(xiàn)圖片推拉門效果代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05js實(shí)現(xiàn)鼠標(biāo)移到鏈接文字彈出一個(gè)提示層的方法
這篇文章主要介紹了js實(shí)現(xiàn)鼠標(biāo)移到鏈接文字彈出一個(gè)提示層的方法,涉及javascript鼠標(biāo)事件與css樣式的相關(guān)技巧,需要的朋友可以參考下2015-05-05javascript從定義到執(zhí)行 你不知道的那些事
這篇文章主要介紹了javascript從定義到執(zhí)行,你不知道的那些事,感興趣的小伙伴們可以參考一下2016-01-01