欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

JavaScript對象中怎么嵌入私有成員

JavaScript 對象中怎么嵌入私有成員,針對這個問題,這篇文章詳細(xì)介紹了相對應(yīng)的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

成都創(chuàng)新互聯(lián)公司服務(wù)項目包括望都網(wǎng)站建設(shè)、望都網(wǎng)站制作、望都網(wǎng)頁制作以及望都網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,望都網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到望都省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

1. 為何要用私有成員(Private Members)

當(dāng)你用JavaScript 創(chuàng)建一個對象時,可以聲明值成員(value members)。 如果你打算控制對它們的讀/寫訪問操作,可以如下聲明:

var entity = {};  entity._property = "hello world"; Object.defineProperty(entity, "property", {     get: function () { return this._property; },     set: function (value) {         this._property = value;     },     enumerable: true,     configurable: true });

這樣實(shí)現(xiàn),你能完全控制讀和寫操作。問題在于_property 成員仍然可以直接訪問和修改。

這也就是為何我們需要更加穩(wěn)定可靠的方式,聲明私有成員,它智能通過對象的方法來訪問。

2. 使用閉包空間(Closure Space)

解決方法是使用閉包空間。每當(dāng)內(nèi)部函數(shù) (inner fanction) 訪問來自外部函數(shù)作用域的變量時,瀏覽器為你分配一段內(nèi)存空間。有時很取巧,不過就我們的題目來講,這算是一個***的解決方案。

我們在上個代碼版本中添加這個特性:

var createProperty = function (obj, prop, currentValue)  {     Object.defineProperty(obj, prop,      {             get: function () { return currentValue; },             set: function (value) {             currentValue = value;                     },                     enumerable: true,                     configurable: true    });                     }  var entity = {};  var myVar = "hello world";createProperty(entity, "property", myVar);

示例中,createProperty 函數(shù)有一個 currentValue 變量,存在 get 和 set 方法。此變量會保存到 get 和 set 函數(shù)的閉包空間中。現(xiàn)在,只有這兩個函數(shù)能看到和更新 currentValue 變量! 任務(wù)完成!

唯一需要警惕 caveat,警告,注意)的是源值 (myVar) 仍可訪問。下面給出另一個更健壯的版本(保護(hù) myVar 變量):

var createProperty = function (obj, prop) {     var currentValue = obj[prop];     Object.defineProperty(obj, prop, {         get: function () { return currentValue; },         set: function (value) {             currentValue = value;         },         enumerable: true,         configurable: true     }); }  var entity = {     property: "hello world" };  createProperty(entity, "property");

采用該函數(shù), 即便源值都銷毀(destructed,注:意思是不能直接賦值)了。到此大功告成了!

3. 性能考慮Performance Considerations

現(xiàn)在咱們看看性能。

很明顯,比起一個簡單的變量,閉包空間,甚或(對象)屬性要慢的多,且更消耗資源。這就是本文更多關(guān)注普通方式和閉包空間機(jī)制差異的原因。

為證明閉包空間機(jī)制并不比標(biāo)準(zhǔn)方式更消耗資源, 我寫了下面代碼做個基準(zhǔn)測試:

<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head>     <title></title> </head> <style>     html {         font-family: "Helvetica Neue", Helvetica;     } </style> <body>     <div id="results">Computing...</div>     <script>         var results = document.getElementById("results");         var sampleSize = 1000000;         var opCounts = 1000000;          var entities = [];          setTimeout(function () {             // Creating entities             for (var index = 0; index < sampleSize; index++) {                 entities.push({                     property: "hello world (" + index + ")"                 });             }              // Random reads             var start = new Date().getTime();             for (index = 0; index < opCounts; index++) {                 var position = Math.floor(Math.random() * entities.length);                 var temp = entities[position].property;             }             var end = new Date().getTime();              results.innerHTML = "<strong>Results:</strong><br>Using member access: <strong>" + (end - start) + "</strong> ms";         }, 0);          setTimeout(function () {             // Closure space =======================================             var createProperty = function (obj, prop, currentValue) {                 Object.defineProperty(obj, prop, {                     get: function () { return currentValue; },                     set: function (value) {                         currentValue = value;                     },                     enumerable: true,                     configurable: true                 });             }             // Adding property and using closure space to save private value             for (var index = 0; index < sampleSize; index++) {                 var entity = entities[index];                  var currentValue = entity.property;                 createProperty(entity, "property", currentValue);             }              // Random reads             var start = new Date().getTime();             for (index = 0; index < opCounts; index++) {                 var position = Math.floor(Math.random() * entities.length);                 var temp = entities[position].property;             }             var end = new Date().getTime();              results.innerHTML += "<br>Using closure space: <strong>" + (end - start) + "</strong> ms";         }, 0);          setTimeout(function () {             // Using local member =======================================             // Adding property and using local member to save private value             for (var index = 0; index < sampleSize; index++) {                 var entity = entities[index];                  entity._property = entity.property;                 Object.defineProperty(entity, "property", {                     get: function () { return this._property; },                     set: function (value) {                         this._property = value;                     },                     enumerable: true,                     configurable: true                 });             }              // Random reads             var start = new Date().getTime();             for (index = 0; index < opCounts; index++) {                 var position = Math.floor(Math.random() * entities.length);                 var temp = entities[position].property;             }             var end = new Date().getTime();              results.innerHTML += "<br>Using local member: <strong>" + (end - start) + "</strong> ms";         }, 0);      </script> </body> </html>

我創(chuàng)建了一百萬個對象,都有屬性成員。要完成下面三個測試:

  • 執(zhí)行 1百萬次隨機(jī)訪問屬性。

  • 執(zhí)行1百萬次隨機(jī)訪問閉包空間實(shí)現(xiàn)版本。

  • 執(zhí)行1百萬次隨機(jī)訪問常規(guī)get/set實(shí)現(xiàn)版本。

測試結(jié)果參見下面表格和圖表:

JavaScript 對象中怎么嵌入私有成員

JavaScript 對象中怎么嵌入私有成員

我們發(fā)現(xiàn),閉包空間實(shí)現(xiàn)總是快于常規(guī)實(shí)現(xiàn),根據(jù)瀏覽器的不同,還可以做進(jìn)一步的性能優(yōu)化。

Chrome 上的性能表現(xiàn)低于預(yù)期。或許存在 bug,因此,為確認(rèn)(存在 bug),我聯(lián)系了 Google 項目組,描述發(fā)生的癥狀。還有,如果你打算測試在 Microsoft Edge &mdash;微軟新發(fā)布的瀏覽器,在windows10 中默認(rèn)安裝&mdash;中的性能表現(xiàn),你可以點(diǎn)擊下載 。

然而,如果仔細(xì)研究,你會發(fā)現(xiàn),使用閉包空間或?qū)傩员戎苯釉L問變量成員要10倍左右。 因此,使用要恰當(dāng)且謹(jǐn)慎。

JavaScript 對象中怎么嵌入私有成員

4. 內(nèi)存占用(Memory Footprint)

我們也得驗證該技術(shù)不會消耗過多內(nèi)存。為測試內(nèi)存占用基準(zhǔn)情況,我寫了下面代碼段:

直接屬性引用版本(Reference Code)

var sampleSize = 1000000;  var entities = [];  // Creating entities for (var index = 0; index < sampleSize; index++) {     entities.push({             property: "hello world (" + index + ")" });}  常規(guī)方式版本(Regular Way,get/set)  var sampleSize = 1000000;  var entities = [];  // Adding property and using local member to save private value for (var index = 0; index < sampleSize; index++) {     var entity = {};      entity._property = "hello world (" + index + ")";     Object.defineProperty(entity, "property", {         get: function () { return this._property; },         set: function (value) {             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.defineProperty(obj, prop, {         get: function () { return currentValue; },         set: function (value) {             currentValue = value;         },         enumerable: true,         configurable: true     }); }  // Adding property and using closure space to save private value for (var index = 0; index < sampleSize; index++) {     var entity = {};      var currentValue = "hello world (" + index + ")";     createProperty(entity, "property", currentValue);      entities.push(entity); }

之后,我(在三個主流瀏覽器上)運(yùn)行所有的三段代碼,啟動(瀏覽器)內(nèi)嵌的內(nèi)存性能分析器(本示例中使用 F12 工具條):

JavaScript 對象中怎么嵌入私有成員

我計算機(jī)上運(yùn)行的結(jié)果如下圖表:

JavaScript 對象中怎么嵌入私有成員

就閉包空間和常規(guī)方式,只有 Chrome上,閉包空間(內(nèi)存占用)表現(xiàn)稍好,在 IE11 和 Firefox上占用內(nèi)存反而增多,但是瀏覽器的比較結(jié)果e&mdash;對于現(xiàn)代瀏覽器,用戶很可能不會在意這點(diǎn)差別。

更多 JavaScript 實(shí)踐

或許你會吃驚,微軟提供了一批有關(guān)開源 Javascript 主題的免費(fèi)學(xué)習(xí)材料, 我們正在發(fā)起一個任務(wù),關(guān)于創(chuàng)建更多 Microsoft Edge 來臨 系列。 查看我的文章:

  • 基于 HTML5 和 Babylon.JS 開發(fā) WebGL 3D 基礎(chǔ)

  • 構(gòu)建單頁面應(yīng)用,基于 ASP.NET 和 AngularJS

  • HTML 高級圖像技術(shù)

或者我們團(tuán)隊系列:

  • HTML/JavaScript 性能優(yōu)化使用技巧 (該系列有7部分,從響應(yīng)式設(shè)計到休閑游戲的性能優(yōu)化)

  • 現(xiàn)代 Web 平臺快速起步 ( HTML, CSS, and JS基礎(chǔ))

  • 開發(fā)通用的 Windows Apps,使用 HTML 和 JavaScript 快速起步 (使用你自己的JS構(gòu)建app)

關(guān)于JavaScript 對象中怎么嵌入私有成員問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識。

分享標(biāo)題:JavaScript對象中怎么嵌入私有成員
分享網(wǎng)址:http://aaarwkj.com/article10/gjgpgo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站服務(wù)器托管、面包屑導(dǎo)航用戶體驗、自適應(yīng)網(wǎng)站、響應(yīng)式網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)
免费在线观看97视频| 亚洲欧美一区二区三区三| 亚洲成人av毛片在线观看| 久久久久四虎国产精品| 亚洲区自拍偷拍一区二区| 日韩精品一区伦理视频| 亚洲精品国产av一区| 美女高潮呻吟免费观看久久久| 亚洲综合av婷婷激情| 欧美日韩亚洲视频一区久久| 成人av在线播放亚洲| 婷婷六月开心激情五月| 婷婷五激情五月激情片| 亚洲日本韩国三级一区| 91中文字幕精品一区二区| 国产剧情av网址观看免费| 在线看日本一区二区| 熟女自拍偷拍视频播放| 日本中文字幕免费专区| 亚洲中文字幕女同系列av专区 | 国产午夜精品一区二区三区| 人人妻夜夜天天俺去添噜| 91九色蝌蚪国产欧美亚洲| 五月婷婷色综合激情五月| 国产亚洲精品久久综合阿香| 一区二区不卡日韩av| 丰满少妇诱惑在线观看| 亚洲中文字幕高清乱码毛片| 亚洲午夜一区二区三区精品影院| 成人午夜福利影院在线| 亚洲综合国产一二三四五区| 久久人人97超碰人人爱一久久精品| 国产乱肥老妇国产一区二| 久久精品国产亚洲av高清综合| 日本一区二区三区日韩欧美| 高清中文字幕一区二区三区| 国产日韩欧美国产精品| 天天躁日日躁夜夜躁夜夜| 黑人巨大精品欧美黑寡妇| 成人看片亚欧大片在线观看| 亚洲人妖视频在线观看|