最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript使用Proxy編寫一個取值限制器

 更新時間:2023年12月29日 08:46:22   作者:天花板  
最近一直在開發(fā)低代碼平臺的東西,由于項目里面東西有點多,取值或調(diào)用起來比較麻煩,使用本文就將使用Proxy編寫一個取值限制器,需要的小伙伴可以參考下

前言

最近一直在開發(fā)低代碼平臺的東西,由于項目里面東西有點多,取值或調(diào)用起來比較麻煩,特別是那些實例的特殊函數(shù)和變量。

所以我實現(xiàn)了一個實例收集器,讓開發(fā)者的權(quán)限變得非常高,細節(jié)就不聊了。

盡管這樣子會讓開發(fā)的體驗變得很簡單,但是大家都知道最便宜的東西往往是最昂貴的,當你可以隨意在項目中讀取到不同組件的實例的時候,很容易導(dǎo)致某一個組件和另一個風馬牛不相及的組件產(chǎn)生關(guān)聯(lián),當某一側(cè)不當操作修了實例的某些內(nèi)容的話,很可能導(dǎo)致隱藏且嚴重的bug。

因此對于這種上帝的操作 必須進行限制,因此對此我創(chuàng)建了一個取值限制器來進行約束,代碼很簡單,不妨一看。

源碼實現(xiàn)

// 初始化 限制proxy生成函數(shù) 的 構(gòu)造函數(shù)
// fn 校驗當前對象是否可以讀取
const LimitProxyConstructorFn = (fn) => {
  // 限制proxy
  // target 需要劫持的對象
  const createLimitProxy = (target) => {
    return new Proxy(target, {
      get(target, property) {
        const res = Reflect.get(target, property);
        const isLegal = fn(property);
        // 判斷當前取值是否是對象,因為對象可能要限制取值
        if (typeof res === "object" && res !== null) {
          // 合法對象 返回一個禁止賦值但支持取值的proxy對象
          if (isLegal) {
            return new Proxy(target, {
              get(target, property) {
                return Reflect.get(target, property);
              },
              set() {
                throw new Error("無法寫入屬性");
              },
            });
          }
          // 如果不合法,則遞歸創(chuàng)建 限制proxy
          return createLimitProxy(res);
        } else {
          // 如果當前項不是對象,判斷是否合法,合法則返回,反之異常
          if (isLegal) return res;
          throw new Error("取值不合法");
        }
      },
      set() {
        throw new Error("無法寫入屬性");
      },
    });
  };
  return createLimitProxy;
};

測試用例

初始化限制proxy對象構(gòu)造函數(shù)

效果如下:

limitProxy 是一個proxy代理對象

看到藍色框里面的是取值操作,只有以__開頭的屬性才能讀取。

如果__ 開頭的屬性是一個對象則,該對象下所有的屬性都可以讀取。

反之認為讀取不合法。

可以看到紅框里面都是賦值操作,限制proxy禁用了所有的賦值操作,保證原數(shù)據(jù)的安全

代碼解釋

這段代碼的作用是創(chuàng)建一個可以限制對象屬性讀取和寫入操作的代理對象生成函數(shù)。傳入的驗證函數(shù) fn 用于確定哪些屬性是合法的。
生成的代理對象會根據(jù)驗證函數(shù)的結(jié)果,限制對屬性的讀取和寫入操作。

代碼解釋:

  • 代碼定義了一個限制proxy函數(shù)的生成函數(shù) LimitProxyConstructorFn,該函數(shù)接受一個參數(shù) fn,用于驗證當前對象是否可以讀取,fn接受一個一個參數(shù)property,即當前讀取的對象的key的名稱,需要返回boolean判斷是否合法。
  • 函數(shù)內(nèi)部定義了一個名為 createLimitProxy 的函數(shù),它接受一個參數(shù) target,表示需要劫持的對象。createLimitProxy 函數(shù)使用 new Proxy() 創(chuàng)建一個代理對象來限制目標對象的操作。

代理對象的 get 處理邏輯如下:

使用 Reflect.get() 獲取原始對象 target 的屬性值,并將結(jié)果存儲在變量 res 中。

調(diào)用驗證函數(shù) fn 并傳入屬性名稱 property,將結(jié)果存儲在變量 isLegal 中,用于判斷屬性是否合法。

如果取值 res 是對象(不包括 null),則進行進一步處理:

  • 如果對象合法(isLegal 為 true),則返回一個新的代理對象,該對象禁止賦值但允許取值。這個新代理對象的 get 處理邏輯與原始代理對象相同,即返回原始對象的屬性值,而 set 處理邏輯拋出一個錯誤,表示無法寫入屬性。
  • 如果對象不合法,則遞歸調(diào)用 createLimitProxy 函數(shù),創(chuàng)建針對該對象的限制代理,并返回限制代理對象。

如果取值 res 不是對象,則判斷屬性是否合法:

  • 如果屬性合法,則直接返回取值 res。
  • 如果屬性不合法,則拋出一個錯誤,表示取值不合法。

代理對象的 set 處理邏輯與上述相同,無論是對原始對象還是對代理對象進行屬性賦值操作,都會拋出一個錯誤,表示無法寫入屬性。

構(gòu)造函數(shù) LimitProxyConstructorFn 返回內(nèi)部定義的 createLimitProxy 函數(shù),以便可以使用該函數(shù)來生成限制代理對象。

總結(jié)

總的來說這個東西還挺有意思的,特別是那種需要限制取值權(quán)限的場景,代碼也很少,感興趣的朋友不妨了解一下,當然代碼還有不少優(yōu)化空間。

到此這篇關(guān)于JavaScript使用Proxy編寫一個取值限制器的文章就介紹到這了,更多相關(guān)JavaScript Proxy取值限制器內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • JavaScript下一版本標準ES6的Set集合使用詳解

    JavaScript下一版本標準ES6的Set集合使用詳解

    ES6:全稱ECMAScript 6.0,是JavaScript語言的國際標準,JavaScript是ECMAScript的實現(xiàn)。今天我們就來學習一下ES6的Set集合的使用
    2023-02-02
  • 在ASP.NET MVC項目中使用RequireJS庫的用法示例

    在ASP.NET MVC項目中使用RequireJS庫的用法示例

    這篇文章主要介紹了在ASP.NET MVC項目中使用RequireJS的用法示例,文中主要講解了網(wǎng)站項目的一些基本目錄結(jié)構(gòu)思想,并給出了一個半自動壓縮的例子,的朋友可以參考下
    2016-02-02
  • 在Web前端實現(xiàn)流式TTS播放的排坑過程

    在Web前端實現(xiàn)流式TTS播放的排坑過程

    在前端實現(xiàn)流式TTS,核心目標是把文本輸入轉(zhuǎn)化為沉浸式的、幾乎無感延遲的音頻輸出,并且在音頻進入瀏覽器的瞬間就能開始播放,這篇文章主要介紹了在Web前端實現(xiàn)流式TTS播放的排坑過程,需要的朋友可以參考下
    2026-05-05
  • JavaScript設(shè)計模式中的橋接和中介者模式

    JavaScript設(shè)計模式中的橋接和中介者模式

    這篇文章主要介紹了JavaScript設(shè)計模式中的橋接和中介者模式,橋接設(shè)計模式是一種偏向于組合的設(shè)計模式,而非繼承的設(shè)計模式,實現(xiàn)的細節(jié)從一個模塊推送給另一個具有單獨模塊的對象,而中介者設(shè)計模式是指通過一個中介者對象封裝一系列的對象交互
    2022-06-06
  • 用JavaScript實現(xiàn)簡單網(wǎng)頁時鐘

    用JavaScript實現(xiàn)簡單網(wǎng)頁時鐘

    這篇文章主要為大家詳細介紹了用JavaScript實現(xiàn)簡單網(wǎng)頁時鐘,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • Javascript Symbol原理及使用方法解析

    Javascript Symbol原理及使用方法解析

    這篇文章主要介紹了Javascript Symbol原理及使用方法解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • 利用10行js代碼實現(xiàn)上下滾動公告效果

    利用10行js代碼實現(xiàn)上下滾動公告效果

    這篇文章主要給大家介紹了關(guān)于利用10行js代碼實現(xiàn)滾動公告效果的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起看看吧。
    2017-12-12
  • JavaScript中call和apply方法的區(qū)別實例分析

    JavaScript中call和apply方法的區(qū)別實例分析

    這篇文章主要介紹了JavaScript中call和apply方法的區(qū)別,結(jié)合實例形式分析call和apply方法的功能、原理及相關(guān)使用操作區(qū)別,需要的朋友可以參考下
    2018-08-08
  • JavaScript的DOM與BOM的區(qū)別與用法詳解

    JavaScript的DOM與BOM的區(qū)別與用法詳解

    這篇文章主要為大家詳細介紹了JavaScript的DOM與BOM的區(qū)別與用法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • Typescript 實現(xiàn)函數(shù)重載的方式

    Typescript 實現(xiàn)函數(shù)重載的方式

    函數(shù)重載簡單點說就是,同一個函數(shù)的不同實現(xiàn)方式,根據(jù)傳入的參數(shù)的類型或者長度,決定最終調(diào)用哪一個實現(xiàn),本文給大家介紹了Typescript 實現(xiàn)函數(shù)重載的方式,需要的朋友可以參考下
    2024-05-05

最新評論

华坪县| 浦东新区| 渭源县| 湘阴县| 丹寨县| 聂荣县| 咸宁市| 探索| 伊通| 淮阳县| 博湖县| 松原市| 格尔木市| 金阳县| 湟源县| 当雄县| 安国市| 凭祥市| 吉隆县| 元氏县| 青田县| 靖江市| 沂南县| 都昌县| 射阳县| 淳安县| 海兴县| 和田县| 鄂温| 道真| 固原市| 维西| 茶陵县| 子洲县| 山东| 育儿| 宁阳县| 淳化县| 旺苍县| 朝阳区| 淮滨县|