js apply和call

之一------(函數(shù)的劫持與對象的復(fù)制)

關(guān)于對象的繼承,一般的做法是用復(fù)制法: Object.extend?

見protpotype.js 的實(shí)現(xiàn)方法:

Object.extend = function(destination, source) ...{?

for (property in source) ...{?

destination[property] = source[property];?

}?

return destination;?

}?

除此以外嘴纺,還有一種不太常見的方法:? Function.apply.?

apply 方法能劫持(<> 書中用到"劫持"一語几睛,很生動啊)另外一個(gè)對象的方法房轿,?

繼承另外一個(gè)對象的屬性。?

示范代碼如下:?

Apply示范代碼


function Person(name,age)...{?? //定義一個(gè)類所森,人類?

this.name=name???? //名字?

this.age=age?????? //年齡?

this.sayhello=function()...{alert("hello")}?

}?

function Print()...{??????????? //顯示類的屬性?

this.funcName="Print"?

this.show=function()...{?

var msg=[]?

for(var key in this)...{?

if (typeof(this[key])!="function") msg.push([key,":",this[key]].join(""))?

}?

alert(msg.join(" "))?

}?

}?

function Student(name,age,grade,school)...{??? //學(xué)生類?

Person.apply(this,arguments)?

Print.apply(this,arguments)?

this.grade=grade????????????????? //年級?

this.school=school??????????????????? //學(xué)校?

}?

var p1=new Person("jake",10)?

p1.sayhello()?

var s1=new Student("tom",13,6,"清華小學(xué)")?

s1.show()?

s1.sayhello()?

alert(s1.funcName)?


學(xué)生類本來不具備任何方法囱持,但是在 Person.apply(this,arguments)? 后,他就具備了 Person類的sayhello方法和 所有屬性焕济。? 在 Print.apply(this,arguments) 后就自動得到了? show() 方法纷妆。

本文,作為拋磚引玉晴弃,只對 apply 的用法(在對象繼承和函數(shù)劫持方面)做個(gè)小示范掩幢,其他更深入的應(yīng)用要?

靠大家慢慢去領(lǐng)會了。

之二------利用Apply的參數(shù)數(shù)組化來提高

我們再來聊聊Function.apply() 在提升程序性能方面的技巧上鞠。

我們先從 Math.max() 函數(shù)說起际邻,? Math.max后面可以接任意個(gè)參數(shù),最后返回所有參數(shù)中的最大值芍阎。

比如?

alert(Math.max(5,8))?? //8

alert(Math.max(5,7,9,3,1,6))?? //9

但是在很多情況下世曾,我們需要找出數(shù)組中最大的元素。

var arr=[5,7,9,1]

alert(Math.max(arr))??? //?? 這樣卻是不行的谴咸。一定要這樣寫

function getMax(arr){

var arrLen=arr.length;

for(var i=0,ret=arr[0];i

ret=Math.max(ret,arr[i]);?

}

return ret;

}

這樣寫麻煩而且低效轮听。如果用 apply呢,看代碼:

function getMax2(arr){

return Math.max.apply(null,arr)

}

兩段代碼達(dá)到了同樣的目的寿冕,但是getMax2卻優(yōu)雅蕊程,高效,簡潔得多驼唱。

看性能測試:

getMax性能測試

var myArr=new Array()

function fillRnd(arrLen){? //填入 arrLen個(gè)1-10的隨機(jī)數(shù)字到數(shù)組

for(var i=0,arr=[];i

arr[i]=Math.ceil(Math.random()*10)

}

return arr

}

function getMax(arr){

var arrLen=arr.length;

for(var i=0,ret=arr[0];i

ret=Math.max(ret,arr[i]);?

}

return ret;

}

function getMax2(arr){

return Math.max.apply(null,arr)

}

myArr=fillRnd(20*10000)? //生成20萬個(gè)隨機(jī)數(shù)填到數(shù)組

var t1=new Date()

var max1=getMax(myArr)

var t2=new Date()

var max2=getMax2(myArr)

var t3=new Date()

if (max1!==max2) alert("error")

alert([t3-t2,t2-t1])?? //在我機(jī)器上 96,464 .不同的機(jī)器,結(jié)果可能有差異

通過20萬個(gè)數(shù)據(jù)的比較藻茂, getMax2 時(shí)間為 96ms 而 getmax時(shí)間為464。 兩者相差5倍

再比如數(shù)組的push方法。

var arr1=[1,3,4];

var arr2=[3,4,5];

如果我們要把 arr2展開辨赐,然后一個(gè)一個(gè)追加到 arr1中去优俘,最后讓? arr1=[1,3,4,3,4,5]

arr1.push(arr2)? 顯然是不行的。 因?yàn)檫@樣做會得到? [1,3,4, [3,4,5] ]

我們只能用一個(gè)循環(huán)去一個(gè)一個(gè)的push?? (當(dāng)然也可以用 arr1.concat(arr2) 但是concat方法并不改變 arr1本身)

var arrLen=arr2.length

for(var i=0;i

arr1.push(arr2[i])

}

自從有了 Apply??? ,事情就變得如此簡單

Array.prototype.push.apply(arr1,arr2)


注:文章來源于http://www.cnblogs.com/xiaohongwu/archive/2011/06/15/2081237.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末掀序,一起剝皮案震驚了整個(gè)濱河市帆焕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌不恭,老刑警劉巖叶雹,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異换吧,居然都是意外死亡折晦,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門沾瓦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來满着,“玉大人,你說我怎么就攤上這事贯莺》缋” “怎么了?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵缕探,是天一觀的道長魂莫。 經(jīng)常有香客問我,道長撕蔼,這世上最難降的妖魔是什么豁鲤? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮鲸沮,結(jié)果婚禮上琳骡,老公的妹妹穿的比我還像新娘。我一直安慰自己讼溺,他們只是感情好楣号,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著怒坯,像睡著了一般炫狱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上剔猿,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天视译,我揣著相機(jī)與錄音,去河邊找鬼归敬。 笑死酷含,一個(gè)胖子當(dāng)著我的面吹牛鄙早,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播椅亚,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼限番,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了呀舔?” 一聲冷哼從身側(cè)響起弥虐,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤嫁盲,失蹤者是張志新(化名)和其女友劉穎怠缸,沒想到半個(gè)月后浦徊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體须板,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年硅瞧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了薯酝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡豺妓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出布讹,到底是詐尸還是另有隱情琳拭,我是刑警寧澤,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布描验,位于F島的核電站白嘁,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏膘流。R本人自食惡果不足惜絮缅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望呼股。 院中可真熱鬧耕魄,春花似錦、人聲如沸彭谁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缠局。三九已至则奥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間狭园,已是汗流浹背读处。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唱矛,地道東北人罚舱。 一個(gè)月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓俊戳,卻偏偏與公主長得像,于是被迫代替她去往敵國和親馆匿。 傳聞我的和親對象是個(gè)殘疾皇子抑胎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 今日任務(wù) 1)電信SP統(tǒng)計(jì)項(xiàng)目測試 --- 完成 2)考核細(xì)則完善 ---- 完成 3)開會-和成員溝通考核(未...
    灼灼2015閱讀 242評論 0 0
  • <網(wǎng)上書城>(day03) 今天的主要內(nèi)容分三個(gè)部分: 一,修改昨天的頁面布局渐北。 解決的辦法其實(shí)很簡單阿逃,把各個(gè)...
    陳二狗Zz閱讀 175評論 0 0
  • 初始化 所有 Flask 程序都必須創(chuàng)建一個(gè) app 實(shí)例。Web 服務(wù)器使用 Web 服務(wù)器網(wǎng)關(guān)接口協(xié)議(Web...
    焉知非魚閱讀 2,065評論 0 1
  • 成長常有遺憾赃蛛,幸好文字能溫情溫傷恃锉。 你也和我一樣,熱愛寫字吧 寫字呕臂,是生活的一種方式破托。 愿你遇到陰雨天 也能做自己...
    Loka0704閱讀 263評論 0 5
  • 洛陽女兒對門居,才可顏容十五余歧蒋。良人玉勒乘驄馬土砂,侍女金盤膾鯉魚。畫閣朱樓盡相望谜洽,紅桃綠柳垂檐向萝映。羅帷送上七香車,寶...
    Love李木子閱讀 563評論 1 2