由JavaScript中call()方法引發(fā)的對(duì)面向?qū)ο罄^承機(jī)制call的思考
今天在閱讀snandy大神的讀jQuery之五(取DOM元素)時(shí),看到有講到toArray()方法,具體jQuery代碼如下:
toArray: function() {
return slice.call( this, 0 );
},
get: function( num ) {
return num == null ?
// Return a 'clean' array
this.toArray() :
// Return just the object
( num < 0 ? this[ this.length + num ] : this[ num ] );
},
看到這里的call()方法,以前也看過手冊(cè),說(shuō)是對(duì)象冒充的,用于繼承的。在jQuery源碼里有點(diǎn)亂,所以就把這部分提取出來(lái),放在一個(gè)單獨(dú)文件中,來(lái)看看具體執(zhí)行。
但還是沒太明白,今天決定研究下call。于是查了下MDN上的說(shuō)明,心血來(lái)潮,拿出我的“葵花寶典”-牛津大辭典,準(zhǔn)備練習(xí)下自己的英文水平,提高提高,而且也提供給有需要的朋友一些幫助(翻譯中如果有些出路,請(qǐng)各位前輩見諒!)
call
摘要:
通過給定的this和arguments來(lái)調(diào)用一個(gè)function
注意:該方法與apply方法語(yǔ)法相似,但不同的是:call()接受參數(shù)列,而apply()接受傳遞給函數(shù)的參數(shù)數(shù)組
Function類的一個(gè)方法:版本JavaScript 1.3版以后
語(yǔ)法:
fun.call(thisArg[, arg1[, arg2[, ...]]])
參數(shù)說(shuō)明:
thisArg:
為fun()的調(diào)用指定對(duì)象。注意:你看到的this值可能不是實(shí)際的值:如果這個(gè)方法是在 non-strict mode下,null和undefined會(huì)被全局對(duì)象替換掉,原始的值會(huì)被封裝。
arg1,arg2,....
this對(duì)象的參數(shù)
描述:
當(dāng)調(diào)用一個(gè)已存在的函數(shù),你可以分配不同的對(duì)象。這時(shí),this指定的對(duì)象是當(dāng)前正在調(diào)用對(duì)象。
通過call,你可以只寫一次方法,而被另一個(gè)對(duì)象來(lái)繼承。而不用自己再新建對(duì)象時(shí),重寫該方法。(即對(duì)象冒充,下面會(huì)有例子說(shuō)明?。?
在MDN官網(wǎng)上面有例子可以看看。另外,無(wú)意中在stackoverflow上看到了篇相關(guān)的問題,看到里面的一個(gè)回答,一下子就明白了對(duì)象冒充,怎么冒充了。
下面把那部分摘取出來(lái)(點(diǎn)擊這里看原文):
In javascript, methods of an object can be bound to another object at runtime. In short, javascript allows an object to "borrow" the method of another object:
object1 = {
name:'frank',
greet:function(){
alert('hello '+this.name)
}
};
object2 = {
name:'andy'
};
// Note that object2 has no greet method.
// But we may "borrow" from object1:
object1.greet.call(object2);
The call and apply methods of function objects (in javascript functions are objects as well) allows you to do this. So in your code you could say that the Nodelist is borrowing an array's slice method. What does the conversion is the fact that slice returns another array as it's result.
這里的第一句話說(shuō)的很形象,大致意思就是:在JavaScript中,對(duì)象的方法可綁定到另外一個(gè)對(duì)象上。簡(jiǎn)單點(diǎn)說(shuō),就是,JavaScript中允許對(duì)象‘借用'本不屬于它本身的方法?!懊俺洹币簿筒谎远髁?,就上上面的例子來(lái)說(shuō),object2冒充object1,來(lái)調(diào)用object1的方法。
PS:菜鳥第一次寫博客,有點(diǎn)亂,我相信以后會(huì)慢慢改善,向各位師兄師姐學(xué)習(xí)怎么寫博客,寫好博客。另外歡迎大家給我批評(píng)與指導(dǎo)!
相關(guān)文章
document.write()及其輸出內(nèi)容的樣式、位置控制
document.write(),用于簡(jiǎn)單的打印內(nèi)容到頁(yè)面上,可以逐字打印你需要的內(nèi)容,既然可以輸出變量,肯定會(huì)想要去控制下變量的顯示,比如位置以及樣式2013-08-08js/jquery控制頁(yè)面動(dòng)態(tài)加載數(shù)據(jù) 滑動(dòng)滾動(dòng)條自動(dòng)加載事件的方法
下面小編就為大家?guī)?lái)一篇js/jquery控制頁(yè)面動(dòng)態(tài)加載數(shù)據(jù) 滑動(dòng)滾動(dòng)條自動(dòng)加載事件的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧2017-02-02layui radio單選限制下一個(gè)radio單選的實(shí)例
今天小編就為大家分享一篇layui radio單選限制下一個(gè)radio單選的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2019-09-09原生JavaScript實(shí)現(xiàn)購(gòu)物車
這篇文章主要為大家詳細(xì)介紹了原生JavaScript實(shí)現(xiàn)購(gòu)物車,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-01-01ECMAScript?數(shù)據(jù)類型之Number類型
這篇文章主要介紹了?ECMAScript?數(shù)據(jù)類型之Number類型,Number類型使用IEEE?754格式表示整數(shù)和浮點(diǎn)值,更多相關(guān)內(nèi)容請(qǐng)需要的小伙伴參考下面文章內(nèi)容2022-06-06JavaScript內(nèi)存管理與閉包實(shí)例詳解
不管什么樣的編程語(yǔ)言,在代碼的執(zhí)行過程中都是需要給它分配內(nèi)存的,下面這篇文章主要給大家介紹了關(guān)于JavaScript內(nèi)存管理與閉包的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06整理Javascript基礎(chǔ)語(yǔ)法學(xué)習(xí)筆記
整理Javascript基礎(chǔ)語(yǔ)法學(xué)習(xí)筆記,之前一系列的文章是跟我學(xué)習(xí)Javascript,本文就是進(jìn)一步學(xué)習(xí)javascript基礎(chǔ)語(yǔ)法,希望大家繼續(xù)關(guān)注2015-11-11Svelte框架實(shí)現(xiàn)表格協(xié)同文檔的示例
本文主要介紹了Svelte框架實(shí)現(xiàn)表格協(xié)同文檔的示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01javascript Xml增刪改查(IE下)操作實(shí)現(xiàn)代碼
比較不錯(cuò)的實(shí)現(xiàn)代碼,大家可以仔細(xì)的看下,思路。2009-01-01