<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      [JS] Reflect的基本使用

      Reflect的作用

      一開始學習Reflect的時候其實覺得很迷惑,感覺通過Reflect操作Proxy對象或者Object對象總有一種多此一舉的感覺。

      為什么要使用Reflect操作對象,而不是直接在Proxy和Object上做操作呢?

      原因之一是:Proxy和Object相關的API和操作方式在早期設計得不合理,不規范。但是Proxy和Object又是屬于比較底層的東西,破壞性的改動會影響到非常多的現有代碼。Reflect的提出就是為了解決這個問題,提供了一套現代的、規范的API來操作對象。

      Reflect的優點可以由下面幾點體現出來:

      1. 在對象上定義屬性失敗時:Object.defineProperty(obj, name, desc)直接拋出異常,而Reflect.defineProperty(obj, name, desc)則是返回false。

      2. 將部分命令式的Object操作規范化為函數行為:

        • name in obj變為:Reflect.has(obj, name);
        • delete obj[name]變為:Reflect.deleteProperty(obj, name);
      3. Reflect簡化了一些操作:

        // 老寫法
        Function.prototype.apply.call(Math.floor, undefined, [1.75]) // 1
        
        // 新寫法
        Reflect.apply(Math.floor, undefined, [1.75]) // 1
        

      靜態方法

      • 調用函數:Reflect.apply(target, thisArg, args)

      • 調用構造函數:Reflect.construct(target, args)

      • 讀屬性:Reflect.get(target, name, receiver)

      • 寫屬性:Reflect.set(target, name, value, receiver)

      • 定義屬性:Reflect.defineProperty(target, name, desc)

      • 刪除屬性:Reflect.deleteProperty(target, name)

      • 查詢屬性是否存在:Reflect.has(target, name)

      • 對象所有屬性:Reflect.ownKeys(target)

        等于Object.getOwnPropertyNamesObject.getOwnPropertySymbols

      • 對象是否可擴展:Reflect.isExtensible(target)

      • 讓一個對象不可擴展:Reflect.preventExtensions(target)

      • 獲取屬性的描述對象:Reflect.getOwnPropertyDescriptor(target, name)

      • 獲取對象的原型對象:Reflect.getPrototypeOf(target)

      • 設置對象的原型對象:Reflect.setPrototypeOf(target, prototype)

      使用Proxy實現觀察者模式

      // 創建一個集合來保存觀察者函數
      const observers = new Set();
      
      // 函數:添加新的觀察者函數到觀察者集合中
      function observe(fn){
        observers.add(fn);
      }
      
      // 函數:創建一個可觀察的對象
      function observable(target){
        // 返回一個代理來攔截對目標對象的修改
        return new Proxy(target, {
          set(target, name, value, receiver){
            // 設置目標對象上的屬性
            const result = Reflect.set(target, name, value, receiver);
            // 通知所有觀察者函數屬性的變化
            notify();
            return result;
          }
        });
      }
      
      // 函數:通知所有觀察者函數屬性的變化
      function notify(){
        // 調用觀察者集合中的每一個觀察者函數
        observers.forEach(fn => fn());
      }
      
      // =================================================================
      // 測試部分
      // 創建一個包含count屬性的可觀察對象
      let state = observable({
        count: 1,
      });
      
      // 添加一個觀察者函數,每次state的count屬性更新時,都會在控制臺輸出日志
      observe(() => {
        console.log('state update: ', state.count);
      });
      
      // 多次遞增state的count屬性
      state.count++;
      state.count++;
      state.count++;
      
      

      輸出結果

      state update:  2
      state update:  3
      state update:  4
      
      
      posted @ 2024-07-12 19:24  feixianxing  閱讀(123)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 亚洲乱女色熟一区二区三区| 99精品国产一区二区三区不卡 | 亚洲精品视频一二三四区| 67194熟妇在线观看线路| 中文有码字幕日本第一页| 国产日韩精品中文字幕| 人妻少妇精品中文字幕| 国产成人精品一区二区三区无码| 免费大片av手机看片高清| 无码国内精品久久人妻蜜桃| 亚洲一区二区美女av| 日本边添边摸边做边爱| 韩国精品一区二区三区在线观看| 日韩精品自拍偷拍一区二区| 无码人妻精品一区二区三区蜜桃 | 国产精品第二页在线播放| 午夜毛片不卡免费观看视频| 久久精品国产亚洲av亚| 在线日韩日本国产亚洲| 国产精品毛片无遮挡高清| 久久不见久久见中文字幕免费| 国产精品普通话国语对白露脸| 九九综合va免费看| 国内精品伊人久久久久影院对白| 国内自拍小视频在线看| 国产精品一二三中文字幕| 老色鬼永久精品网站| 松江区| 成人区精品一区二区不卡| 疯狂做受XXXX高潮国产| 亚洲男人的天堂一区二区| 人妻一区二区三区人妻黄色| 人妻aⅴ无码一区二区三区| 成人精品大片—懂色av| 一区二区不卡国产精品| 中文字幕国产精品av| 久久国产精品二国产人妻| 少妇人妻偷人偷人精品| 庄河市| 免费看国产精品3a黄的视频| 国产在线精品第一区二区|