<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          1分鐘學(xué)會如何用 JS 對象代理(proxies)實現(xiàn)對象的私有屬性

          共 2106字,需瀏覽 5分鐘

           ·

          2021-10-22 03:26

          大家好,在上一篇文章《1分鐘搞懂什么是 JS 代理對象(proxies)》學(xué)會了什么是 JS 代理,本篇文章我們繼續(xù)加深下對象代理在實際場景中的運用。

          今天我們來聊聊私有屬性,在其他的高級語言中很容易能實現(xiàn)私有屬性的功能,那么在 JS 中怎么實現(xiàn)對象的私有屬性呢,首先我們聊聊私有屬性運用的需求場景,比如我們在對象里用 _ 符號開頭的形式定義對象的私有屬性,不希望外部環(huán)境讀取私有屬性,如下段代碼所示

          let?bankAccount?=?{
          ????holderName:?'Joe',
          ????currency:?'USD',
          ????_balance:?1000
          }

          我們希望讀取對象 ?_balance 的私有屬性或刪除對象的 _balance 屬性,會有如下的提示:

          //?don't?allow?reading?the?balance
          console.log(bankAccount._balance);
          //?don't?allow?deleting?the?property
          delete?_balance

          那我們該如何實現(xiàn)呢?這時候我們可以使用 JS 代理,針對 _符號開頭的私有屬性進行特殊的邏輯處理(你也可以用其他的符號自定義私有屬性),廢話不多說,上代理的實現(xiàn)的代碼邏輯,以下為代理攔截器方法的代碼:

          let?proxyHandler?=?{?
          ????has:?(target,?prop)?=>?{?
          ????????if(prop.startsWith(prefix)){?
          ????????????return?false;
          ????????}?
          ????????return?prop?in?target?
          ????},?//?針對?in?方法的重寫
          ????ownKeys:?target?=>?{?
          ????????return?Reflect.ownKeys(target).filter(?
          ????????????prop?=>?!prop.startsWith(prefix)?
          ????????)?
          ????},?//針對?keys?方法的重寫
          ????get:?(target,?prop)?=>?{?
          ????????if(prop.startsWith(prefix))?{?
          ????????????return?undefined;?
          ????????}?
          ????????return?target[prop];?
          ????},?
          ????deleteProperty(target,?prop)?{?
          ????????if?(prop.startsWith('_'))?{?
          ????????????return?true;?//私有屬性不刪除
          ????????}?else?{?
          ????????????delete?target[prop];?
          ????????????return?true;?
          ????????}
          ????}
          }

          接下來,我們來驗證下上述代碼是否可行:

          const?hidePrivateFields?=?(target,?prefix?=?"_")?=>?{?
          ????return?new?Proxy(target,?proxyHandler)
          };

          let?bankAccount?=?hidePrivateFields({
          ????holderName:?'Joe',
          ????currency:?'USD',
          ????_balance:?1000
          })

          console.log(bankAccount._balance)?//?undefined?
          console.log('_balance'?in?bankAccount)?//false
          console.log(Object.keys(bankAccount))?//?['holderName',?'currency']?
          console.log(delete?bankAccount._balance)?//?returns?true,?but?does?not?delete?the?balance

          今天關(guān)于 JS 對象代理在私有屬性方面的應(yīng)用就分享到這里,下一篇文章,我們將繼續(xù)分享代理有趣的應(yīng)用,比如以前JQ 插件庫可以通過鏈式語法很容易的操控樣式,如下所示,如果讓你用 JS 對象代理,你會如何實現(xiàn)呢?

          style(".menu").color("#fff").backgroundColor("#000").opacity("1");

          文章來源:http://www.js-craft.io/blog/javascript-proxies-restricting-access-to-object-properties-and-some-other-practical-examples/ ??

          作者:Daniel

          瀏覽 73
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  逼特写乱伦 | 很黄很色免费视频 | 大香蕉久久依人网站 | 日韩动态| 亚洲最大的黄色视频 |