




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、最近,我開發(fā)一個(gè)項(xiàng)目 Angular Cloud Data Connector, 掛念A(yù)ngular開發(fā)者使用云數(shù)據(jù),特殊是 Azure移動(dòng)服務(wù), 使用WEB標(biāo)準(zhǔn),像索引數(shù)據(jù)庫(indexed DB)。我嘗試建立一種方式,使得JavaScript開發(fā)者能將私有成員嵌入到一個(gè)對(duì)象中。我解決這個(gè)問題的技術(shù)用到了我命名的閉包空間(closure space)。在這篇入門文章中,我要共享的是如何在你的項(xiàng)目中用它,及它對(duì)主流掃瞄器的性能和內(nèi)存的影響。在深化學(xué)習(xí)前,咱們先說下,你為什么需要用到私有成員(private members), 還有一種替代方式來模擬私有成員。1. 為何要用私
2、有成員(Private Members)當(dāng)你用JavaScript 創(chuàng)建一個(gè)對(duì)象時(shí),可以聲明值成員(value members)。 假如你打算把握對(duì)它們的讀/寫訪問操作,可以如下聲明:var entity = entity._property = "hello world"Object.defineProperty(entity, "property", get: function ()
3、;return this._property; , set: function (value) this._property = value; , enumerable: true, configurable: true);這樣實(shí)
4、現(xiàn),你能完全把握讀和寫操作。問題在于_property 成員仍舊可以直接訪問和修改。這也就是為何我們需要更加穩(wěn)定牢靠的方式,聲明私有成員,它智能通過對(duì)象的方法來訪問。2. 使用閉包空間(Closure Space)解決方法是使用閉包空間。每當(dāng)內(nèi)部函數(shù) (inner fanction) 訪問來自外部函數(shù)作用域的變量時(shí),掃瞄器為你安排一段內(nèi)存空間。有時(shí)很取巧,不過就我們的題目來講,這算是一個(gè)完善的解決方案。我們?cè)谏蟼€(gè)代碼版本中添加這個(gè)特性:var createProperty = function (obj, prop, currentV
5、alue) Object.defineProperty(obj, prop, get: function () return currentValue; ,
6、160; set: function (value) currentValue = value; ,
7、; enumerable: true, configurable: true );
8、 var entity = var myVar = "hello world"createProperty(entity, "property", myVar);示例中,createProperty 函數(shù)有一個(gè) currentVal
9、ue 變量,存在 get 和 set 方法。此變量會(huì)保存到 get 和 set 函數(shù)的閉包空間中?,F(xiàn)在,只有這兩個(gè)函數(shù)能看到和更新 currentValue 變量! 任務(wù)完成!唯一需要警惕 caveat,警告,留意)的是源值 (myVar) 仍可訪問。下面給出另一個(gè)更健壯的版本(愛護(hù) myVar 變量):var createProperty = function (obj, prop) var currentValue = objprop;
10、0; Object.defineProperty(obj, prop, get: function () return currentValue; , set: function (value)
11、0; currentValue = value; , enumerable: true, configurable: true );var entity
12、 = property: "hello world"createProperty(entity, "property");接受該函數(shù), 即便源值都銷毀(destructed,注:意思是不能直接賦值)了。到此大功告成了!3. 性能考慮Performance Considerations現(xiàn)在咱們看看性能。很明顯,比起一個(gè)簡(jiǎn)潔的變量,閉包空間,甚或(對(duì)象)屬性要慢的多,且更消耗資源。這就是本文更多關(guān)注一般方式和閉包空間機(jī)制差異的緣由。為證明閉包空間機(jī)制并
13、不比標(biāo)準(zhǔn)方式更消耗資源, 我寫了下面代碼做個(gè)基準(zhǔn)測(cè)試:<!DOCTYPE html><html xmlns="/1999/xhtml"><head> <title></title></head><style> html font-fam
14、ily: "Helvetica Neue", Helvetica; </style><body> <div id="results">Computing.</div> <script> var results
15、;= document.getElementById("results"); var sampleSize = 1000000; var opCounts = 1000000; var entities =&
16、#160; setTimeout(function () / Creating entities for (var index = 0;
17、160;index < sampleSize; index+) entities.push( property:
18、"hello world (" + index + ")" );
19、60; / Random reads var start = new Date().getTime(); for (index = 0; index < o
20、pCounts; index+) var position = Math.floor(Math.random() * entities.length);
21、60;var temp = perty; var end = new Date().getTime();
22、160; results.innerHTML = "<strong>Results:</strong><br>Using member access: <strong>" + (end - start) + "</strong> ms" ,
23、0); setTimeout(function () / Closure space = var createProperty = func
24、tion (obj, prop, currentValue) Object.defineProperty(obj, prop,
25、160; get: function () return currentValue; , set: function (value)
26、60; currentValue = value; , &
27、#160; enumerable: true, configurable: true
28、0; ); / Adding property and using closure space to save private value
29、60; for (var index = 0; index < sampleSize; index+) var entity = entitiesindex;
30、60; var currentValue = perty; createProperty(entity, "property", currentValue);
31、0; / Random reads var start = new Date().getTime();
32、; for (index = 0; index < opCounts; index+) var position = Math.floor(Math.random() *
33、60;entities.length); var temp = perty;
34、 var end = new Date().getTime(); results.innerHTML += "<br>Using closure space: <strong>" + (end - start) + "</st
35、rong> ms" , 0); setTimeout(function () / Using local member = &
36、#160; / Adding property and using local member to save private value for (var index = 0; index < sam
37、pleSize; index+) var entity = entitiesindex; entity._property =
38、perty; Object.defineProperty(entity, "property", get: functi
39、on () return this._property; , set: function (value)
40、60; this._property = value; ,
41、; enumerable: true, configurable: true );
42、 / Random reads var start = new Date().getTime(); &
43、#160; for (index = 0; index < opCounts; index+) var position = Math.floor(Math.random()
44、* entities.length); var temp = perty;
45、160; var end = new Date().getTime(); results.innerHTML += "<br>Using local member: <strong>" + (end - start) + "<
46、/strong> ms" , 0); </script></body></html>我創(chuàng)建了一百萬個(gè)對(duì)象,都有屬性成員。要完成下面三個(gè)測(cè)試:· 執(zhí)行 1百萬次隨機(jī)訪問屬性。· 執(zhí)行1百萬次隨機(jī)訪問閉包空間實(shí)現(xiàn)版本。· 執(zhí)行1百萬次隨機(jī)訪問常規(guī)get/set實(shí)現(xiàn)版本。測(cè)試結(jié)果參見下面表格和圖表:我們發(fā)覺,閉包空間實(shí)現(xiàn)總是快于常規(guī)實(shí)現(xiàn),依據(jù)掃瞄器的不同,還可以
47、做進(jìn)一步的性能優(yōu)化。Chrome 上的性能表現(xiàn)低于預(yù)期?;蛟S存在 bug,因此,為確認(rèn)(存在 bug),我聯(lián)系了 Google 項(xiàng)目組,描述發(fā)生的癥狀。還有,假如你打算測(cè)試在 Microsoft Edge 微軟新發(fā)布的掃瞄器,在windows10 中默認(rèn)安裝中的性能表現(xiàn),你可以點(diǎn)擊下載 。然而,假如認(rèn)真爭(zhēng)辯,你會(huì)發(fā)覺,使用閉包空間或?qū)傩员戎苯釉L問變量成員要10倍左右。 因此,使用要恰當(dāng)且謹(jǐn)慎。4. 內(nèi)存占用(Memory Footprint)我們也得驗(yàn)證該技術(shù)不會(huì)消耗過多內(nèi)存。為測(cè)試內(nèi)存占用基準(zhǔn)狀況,我寫了下面代碼段:直接屬性引用版本(Refe
48、rence Code)var sampleSize = 1000000; var entities = / Creating entitiesfor (var index = 0; index < sampleSize; index+) entities.push(
49、160; property: "hello world (" + index + ")");常規(guī)方式版本(Regular Way,get/set)var sampleSize = 1000000;var entities = / Adding property and using local member to&
50、#160;save private valuefor (var index = 0; index < sampleSize; index+) var entity = entity._property = "hello world (" + index +
51、")" Object.defineProperty(entity, "property", get: function () return this._property; , set: function (value)
52、160; this._property = value; , enumerable: true, configurable: true ); entities.push(entity);閉包空間版本(Closure Space Version)var sampleSize = 1000000;var entities = var createProperty = function (obj, prop, currentValue) Object.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 湘潭醫(yī)衛(wèi)職業(yè)技術(shù)學(xué)院《生物信息軟件與數(shù)學(xué)方法》2023-2024學(xué)年第一學(xué)期期末試卷
- 南昌理工學(xué)院《鋼琴即興配奏》2023-2024學(xué)年第一學(xué)期期末試卷
- 錦州師范高等??茖W(xué)?!队⒄Z小說》2023-2024學(xué)年第一學(xué)期期末試卷
- 蘇州農(nóng)業(yè)職業(yè)技術(shù)學(xué)院《城市景觀規(guī)劃設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 三峽旅游職業(yè)技術(shù)學(xué)院《政治學(xué)與行政學(xué)專業(yè)導(dǎo)論》2023-2024學(xué)年第一學(xué)期期末試卷
- 昆明文理學(xué)院《鍛煉心理學(xué)》2023-2024學(xué)年第一學(xué)期期末試卷
- 廣東云浮中醫(yī)藥職業(yè)學(xué)院《制藥過程自動(dòng)化與儀表》2023-2024學(xué)年第一學(xué)期期末試卷
- 山東傳媒職業(yè)學(xué)院《綜合語》2023-2024學(xué)年第一學(xué)期期末試卷
- 世界愛眼日活動(dòng)方案
- 世界閱讀日線上活動(dòng)方案
- 2025年陜西省中考英語試題(附答案和音頻)
- 家庭急救包物品清單
- 護(hù)理安全管理課件
- 附件:小學(xué)2025年暑假跨學(xué)科實(shí)踐作業(yè)實(shí)施方案
- 2025年甘肅省隴南市事業(yè)單位招聘247人筆試參考題庫及答案詳解一套
- 實(shí)驗(yàn)室菌種管理制度
- 如何當(dāng)好一名班主任 課件-2024-2025學(xué)年高一下學(xué)期班主任工作經(jīng)驗(yàn)分享
- 2025年基礎(chǔ)電氣工程考試試題及答案
- 2025年心理健康指導(dǎo)師職業(yè)資格考試試題及答案
- 七年級(jí)下冊(cè)道德與法治期末復(fù)習(xí)必刷主觀題含答案
- 2024年廣東省揭西縣教師招聘考試《教育學(xué)和心理學(xué)基礎(chǔ)知識(shí)》真題庫及答案
評(píng)論
0/150
提交評(píng)論