由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è),說是對(duì)象冒充的,用于繼承的。在jQuery源碼里有點(diǎn)亂,所以就把這部分提取出來,放在一個(gè)單獨(dú)文件中,來看看具體執(zhí)行。
但還是沒太明白,今天決定研究下call。于是查了下MDN上的說明,心血來潮,拿出我的“葵花寶典”-牛津大辭典,準(zhǔn)備練習(xí)下自己的英文水平,提高提高,而且也提供給有需要的朋友一些幫助(翻譯中如果有些出路,請(qǐng)各位前輩見諒!)
call
摘要:
通過給定的this和arguments來調(diào)用一個(gè)function
注意:該方法與apply方法語法相似,但不同的是:call()接受參數(shù)列,而apply()接受傳遞給函數(shù)的參數(shù)數(shù)組
Function類的一個(gè)方法:版本JavaScript 1.3版以后
語法:
fun.call(thisArg[, arg1[, arg2[, ...]]])
參數(shù)說明:
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ì)象來繼承。而不用自己再新建對(duì)象時(shí),重寫該方法。(即對(duì)象冒充,下面會(huì)有例子說明!)
在MDN官網(wǎng)上面有例子可以看看。另外,無意中在stackoverflow上看到了篇相關(guān)的問題,看到里面的一個(gè)回答,一下子就明白了對(duì)象冒充,怎么冒充了。
下面把那部分摘取出來(點(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.
這里的第一句話說的很形象,大致意思就是:在JavaScript中,對(duì)象的方法可綁定到另外一個(gè)對(duì)象上。簡(jiǎn)單點(diǎn)說,就是,JavaScript中允許對(duì)象‘借用'本不屬于它本身的方法。“冒充”也就不言而喻了,就上上面的例子來說,object2冒充object1,來調(diào)用object1的方法。
PS:菜鳥第一次寫博客,有點(diǎn)亂,我相信以后會(huì)慢慢改善,向各位師兄師姐學(xué)習(xí)怎么寫博客,寫好博客。另外歡迎大家給我批評(píng)與指導(dǎo)!
相關(guān)文章
javascript中驗(yàn)證大寫字母、數(shù)字和中文
本文為大家介紹下使用javascript驗(yàn)證大寫字母小寫字母,數(shù)字和中文,具體示例如下2014-01-01
javascript事件監(jiān)聽與事件委托實(shí)例詳解
這篇文章主要介紹了javascript事件監(jiān)聽與事件委托,結(jié)合實(shí)例形式詳細(xì)分析了javascript事件監(jiān)聽與事件委托相關(guān)原理、用法與操作注意事項(xiàng),需要的朋友可以參考下2019-08-08
js動(dòng)態(tài)添加表格數(shù)據(jù)使用insertRow和insertCell實(shí)現(xiàn)
這篇文章主要介紹了js動(dòng)態(tài)添加表格數(shù)據(jù)并使用insertRow和insertCell實(shí)現(xiàn),需要的朋友可以參考下2014-05-05
bootstrap datepicker插件默認(rèn)英文修改為中文
這篇文章主要為大家詳細(xì)介紹了bootstrap datepicker插件默認(rèn)英文修改為中文的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07
javascript Table 中2個(gè)列(TD)的交換實(shí)現(xiàn)代碼
非常不錯(cuò)的用js控制talbe中td的位置的實(shí)現(xiàn)代碼。2009-02-02
A標(biāo)簽中通過href和onclick傳遞的this對(duì)象實(shí)現(xiàn)思路
想傳遞當(dāng)前對(duì)象給一個(gè)函數(shù),于是就將這個(gè)URL寫成"Javascript:shoControlSidebar(this)",可是結(jié)果發(fā)現(xiàn)這并不可行,接下來為大家詳細(xì)介紹下解決方法2013-04-04
微信小程序?qū)崿F(xiàn)簡(jiǎn)單input正則表達(dá)式驗(yàn)證功能示例
這篇文章主要介紹了微信小程序?qū)崿F(xiàn)簡(jiǎn)單input正則表達(dá)式驗(yàn)證功能,結(jié)合實(shí)例形式分析了微信小程序input組件事件綁定及正則驗(yàn)證相關(guān)操作技巧,需要的朋友可以參考下2017-11-11
JavaScript設(shè)計(jì)模式之觀察者模式(發(fā)布訂閱模式)原理與實(shí)現(xiàn)方法示例
這篇文章主要介紹了JavaScript設(shè)計(jì)模式之觀察者模式(發(fā)布訂閱模式)原理與實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了JavaScript觀察者模式概念、原理、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2018-07-07

