欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

js對象屬性的攔截與Proxy代理與Reflect映射的用法和區(qū)別講解

 更新時間:2023年06月01日 10:09:34   作者:堅毅的小解同志  
reflect和proxy都是JavaScript中用于處理對象的特殊API,下面這篇文章主要給大家介紹了關(guān)于js對象屬性的攔截與Proxy代理與Reflect映射的用法和區(qū)別,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

對象屬性的攔截

介紹

在對象中,set 和 get 是屬性的特性,用于定義屬性的賦值和取值行為。它們允許您在屬性被賦值或取值時執(zhí)行自定義的邏輯。

Set

set 是一個對象屬性的特性,用于定義屬性的賦值行為。當給屬性賦值時,set 方法會被調(diào)用,允許執(zhí)行自定義的邏輯。

  let obj = {
            name:0,
            set changename(value){
                if (value >5) {
                     this.name =value;
                }
            }
        }
obj.changename=10  //10
obj.changename=4    //0
console.log(obj.name);

通過changename函數(shù) 在里面進行需要的條件判斷來修改name值,給這個函數(shù)賦值的時候,就會觸發(fā)這個set。

注意 函數(shù)名跟屬性名不能一樣,不然就要遞歸調(diào)用報棧溢出錯誤了

Get

get 用于定義對象屬性的獲取行為。當訪問對象的屬性時,get 方法會被觸發(fā),并且可以在方法中執(zhí)行相應的邏輯。

  let obj = {
            name:0,
            set changename(value){
                if (value >5) {
                   this.name =value;
                }
            },
            get changename(){
               return this.name =1
            },
        }
obj.changename=10  //10
obj.changename=4    //0
console.log(obj.changename); //1  (獲取的時候會觸發(fā)get)

假設 我們要訪問一個屬性,然后不管設置還有獲取都需要對這個屬性進行相應操作 ,我們就可以使用 很好的搭配使用set和get。 其實就相當于你針對一個屬性寫了兩個不同的函數(shù)進行操作,只不過 set get 我們寫的函數(shù)名稱一樣,便于易讀瀏覽。

對象的攔截

介紹

Proxy 是 JavaScript 提供的一個內(nèi)置對象,用于創(chuàng)建一個代理對象,可以攔截并自定義對目標對象的操作。通過使用 Proxy,我們可以對目標對象的屬性訪問、賦值、刪除等操作進行攔截和處理。

使用

   let obj = {
        name: 0,
      };
      let handle = {
        set: function (target, name, value) {
          if (value > 5) {
            target[name] = value;
          }
        },
        get: function (target, name) {
          return (target[name] = 1);
        },
      };
      let proxy = new Proxy(obj, handle);
      proxy.changename = 10; //10
      proxy.changename = 4; //0
      console.log(proxy.changename); //1

通過proxy代理來訪問 對象進行獲取和賦值等操作。

對象屬性攔截和對象攔截區(qū)別

區(qū)別就跟名字一樣,對象屬性攔截,是你在對象中給某個屬性設置攔截操作,當它獲取,和賦值的時候觸發(fā),對象攔截 是設置proxy代理,通過代理來訪問,既然通過代理來訪問對象屬性,則任何操作,只要你對這個對象有操作,都會進行攔截判斷,
也就是說 一個是針對對象里的一個屬性,一個是針對整個對象。

練習題

   let obj = {
          name: 0,
          set changename(value) {
            if (value > 5) {
              this.name = value;
            }
          },
          get changename() {
            return (this.name += 1);
          },
        };
        let handle = {
          //target原對象,name是屬性
          get: function (target, name) {
            target[name] += 1;
            //注意 get 一定要return
            return target[name];
          },
          //value傳的值
          set: function (target, name, value) {
            if (typeof value == "number") {
              target[name] = value;
            }
          },
        };
        let proxy = new Proxy(obj, handle);
        proxy.changename = 10;
        proxy.changename = "4";
        console.log(proxy.changename); 

寫了個題目 供大家練習,感覺有面試題那味兒了,大家看看自己得出的結(jié)果是多少。

揭曉答案: 13。

講解:proxy.changename = 10; 走proxy里的set, set里進行判斷是一個數(shù)值,然后調(diào)用obj對象進行賦值,賦值的時候會觸發(fā)obj的set攔截,判斷大于5,ok最后賦值成10.

第二次 賦值字符串4 set判斷 不通過就沒下文了,默認return 一個undefined。

然后就是最后的顯示了,顯示的時候會觸發(fā)proxy里的get 然后執(zhí)行這段代碼

target[name] += 1;

也就是

target[name] =target[name] +1;

target[name] +1里的target[name] ,就相當于get操作觸發(fā)obj里的get,于是就會加一,10+1變成了11,然后是11加1。也就是十二。
然后return target[name]; 又試一次get 操作 就是12 +1 結(jié)果就變成了 13。

映射

介紹

Reflect 是一個內(nèi)置的 JavaScript 對象,它提供了一組用于操作對象的方法。這些方法與對象的操作行為相對應,例如屬性訪問、函數(shù)調(diào)用、實例化等。

通俗來講,我們可以使用這個對象,來進行日常的對象操作,比如取值,賦值等等一些操作,他同樣可以完成并且有一些其他的優(yōu)點,我們使用reflect一般都是搭配proxy使用。

比如像下面這樣。

const obj = {
  foo: 42,
};

const value = Reflect.get(obj, 'foo');
console.log(value); // 輸出: 42

優(yōu)點

  1. 方便處理和調(diào)用目標對象的默認行為:Reflect 提供了與目標對象的默認行為相對應的方法,比如 Reflect.get、Reflect.set、Reflect.has 等。在 Proxy 的處理程序中使用 Reflect 可以方便地調(diào)用這些方法,從而實現(xiàn)對目標對象默認行為的處理和攔截。
  2. 更嚴謹?shù)腻e誤處理:Reflect 方法的返回值會更加準確地反映操作的結(jié)果,而不是像在使用目標對象的方法時可能會拋出異常。例如,Reflect.set 方法在賦值操作成功時會返回 true,失敗時會返回 false,而不是拋出異常。
  3. 保持 Proxy 和目標對象的行為一致:Proxy 的目標對象可能是任意類型的對象,而 Reflect 提供了一致的方法,可以在 Proxy 的處理程序中對不同類型的目標對象進行操作,保持行為的一致性。
  4. 更清晰的代碼邏輯:使用 Reflect 方法可以使代碼更加簡潔和易讀,因為 Reflect 方法的命名和用法更加一致和直觀,能夠更清晰地表達代碼的意圖。

把它應用到我們上面的題。

 let obj = {
        name: 0,
        set changename(value) {
          if (value > 5) {
            this.name = value;
          }
        },
        get changename() {
          return (this.name += 1);
        },
      };
      let handle = {
        //target原對象,name是屬性
        get: function (target, name) {
          target[name] += 1;
          //注意 get 一定要return
          return Reflect.get(target, name);
        },
        //value傳的值
        set: function (target, name, value) {
          if (typeof value == "number") {
            Reflect.set(target, name, value)
          }
        },
      };
      let proxy = new Proxy(obj, handle);
      proxy.changename = 10;
      proxy.changename = "4";
      console.log(proxy.changename);
      ···

總結(jié)

對象屬性的攔截(Object Property Interception):可以使用對象自身的 get 和 set 方法來攔截屬性的獲取和設置操作。通過在對象上定義這些方法,可以在屬性訪問過程中執(zhí)行自定義的邏輯,例如驗證、轉(zhuǎn)換或攔截。

代理對象(Proxy Object):代理對象是一個代理目標對象的對象,通過代理對象可以攔截對目標對象的操作。代理對象使用 Proxy 構(gòu)造函數(shù)創(chuàng)建,并提供了一組攔截器(handler)來定義攔截行為。

Reflect 映射(Reflect Mapping):Reflect 是一個內(nèi)置的對象,提供了一組與對象操作相關(guān)的方法,用于執(zhí)行與目標對象相同的操作。Reflect 方法提供了一種更簡潔、易讀的方式來執(zhí)行常見的對象操作,如獲取屬性值、設置屬性值、調(diào)用函數(shù)等。

到此這篇關(guān)于js對象屬性的攔截與Proxy代理與Reflect映射的用法和區(qū)別講解的文章就介紹到這了,更多相關(guān)js對象屬性攔截內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • js的hasownproperty使用示例

    js的hasownproperty使用示例

    我們在js中可能經(jīng)常會用到for in來遍歷對象中的屬性,當然for in中得到的屬性,只能是可枚舉的屬性,for in的時候,它會把對象的屬性(包括原型的屬性)遍歷一遍,看面看示例就明白了
    2014-03-03
  • JavaScript 學習初步 入門教程

    JavaScript 學習初步 入門教程

    看了《21天學習JavaScript》的視頻教程,感覺就是語法好熟悉,和C++類似,和C#類似,和Java類似!幡然悔悟這些語言的語法都是類似的,數(shù)據(jù)類型,對象方法(或者稱之為函數(shù),由于我是個菜鳥所以也數(shù)不清楚到底是什么)。
    2010-03-03
  • JavaScript 瀏覽器對象模型BOM使用介紹

    JavaScript 瀏覽器對象模型BOM使用介紹

    這篇文章主要介紹了JavaScript 瀏覽器對象模型BOM使用介紹,需要的朋友可以參考下
    2015-04-04
  • 老生常談js數(shù)據(jù)類型

    老生常談js數(shù)據(jù)類型

    下面小編就為大家?guī)硪黄仙U刯s數(shù)據(jù)類型。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • javascript設計模式之鴨子類型和多態(tài)

    javascript設計模式之鴨子類型和多態(tài)

    這篇文章主要為大家介紹了javascript鴨子類型和多態(tài),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助<BR>
    2022-01-01
  • 關(guān)于JavaScript中的關(guān)聯(lián)數(shù)組分析

    關(guān)于JavaScript中的關(guān)聯(lián)數(shù)組分析

    本篇文章小編為大家介紹,關(guān)于JavaScript中的關(guān)聯(lián)數(shù)組分析。有需要的朋友可以參考一下
    2013-04-04
  • javascript XMLHttpRequest對象全面剖析

    javascript XMLHttpRequest對象全面剖析

    通過不必把Web頁面寄送到服務器而實現(xiàn)數(shù)據(jù)傳送,XMLHttpRequest對象為客戶端與服務器之間提供了一種動態(tài)的交互能力。
    2010-04-04
  • 深入理解JavaScript系列(41):設計模式之模板方法詳解

    深入理解JavaScript系列(41):設計模式之模板方法詳解

    這篇文章主要介紹了深入理解JavaScript系列(41):設計模式之模板方法詳解,模板方法(TemplateMethod)定義了一個操作中的算法的骨架,而將一些步驟延遲到子類中,模板方法使得子類可以不改變一個算法的結(jié)構(gòu)即可重定義該算法的某些特定步驟,需要的朋友可以參考下
    2015-03-03
  • 詳解Javascript基礎(chǔ)之循環(huán)

    詳解Javascript基礎(chǔ)之循環(huán)

    這篇文章主要為大家介紹了Javascript基礎(chǔ)之循環(huán),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2021-12-12
  • 在微信、支付寶、百度錢包實現(xiàn)點擊返回按鈕關(guān)閉當前頁面和窗口的方法

    在微信、支付寶、百度錢包實現(xiàn)點擊返回按鈕關(guān)閉當前頁面和窗口的方法

    這篇文章主要介紹了在微信、支付寶、百度錢包實現(xiàn)點擊返回按鈕關(guān)閉當前頁面和窗口的方法,傳統(tǒng)的window.close()是無效的,必須要使用它們的js代碼才能關(guān)閉。下面小編給大家分享下代碼,一起看看吧
    2016-08-08

最新評論