亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Proxy的不可變數據優點及使用方法是什么

發布時間:2023-03-02 10:59:12 來源:億速云 閱讀:118 作者:iii 欄目:開發技術

這篇文章主要介紹“Proxy的不可變數據優點及使用方法是什么”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“Proxy的不可變數據優點及使用方法是什么”文章能幫助大家解決問題。

可變數據

  • 對象被賦值后,更改對象,兩個都會改變,因為其引用著相同的地址,我們稱這為可變對象

  • 所以這會造成意想不到的修改

  • React 要求本地組件的狀態保持不可變性,Redux 同樣要求全局狀態保持不可變

不可變數據(Immutable Data)

  • Immutable.js 中 對 Immutable 對象 增刪改查都會返回一個全新的 Immutable 對象,保證舊數據的可用不變

  • Immutable 使用了結構共享,即對象樹中的節點改變只會影響自己和其父節點,其他節點共享

優點

  • 保護數據意外更改,減少bug

  • 方便跟蹤數據變更,便于排錯

實現一:獨立方法

  • 調用麻煩

function updateData(obj, key, value) {
  return {
    ...obj,
    [key]: value
  };
}
const obj = {
  name: "云牧"
};
const newObj = updateData(obj, "name", "黛玉");
console.log(newObj); // { name: '黛玉' }
console.log(obj); // { name: '云牧' }

實現二:自定義對象

  • 自定義新的對象類型,對其操作細節封裝在其內部

  • 著名的 immutable-js,就是這個思路,定義了ListStackMapOrderedMapSetOrderedSetRecord 這么多對象

class MyObject {
  constructor(obj = {}) {
    this.obj = { ...obj };
  }
  get(name) {
    return this.obj[name];
  }
  set(name, value) {
    return new MyObject({
      ...this.obj,
      [name]: value
    });
  }
}
const obj = new MyObject({
  name: "云牧"
});
const newObj = obj.set("name", "黛玉");
console.log(newObj); // MyObject { obj: { name: '黛玉' } }
console.log(obj); // MyObject { obj: { name: '云牧' } }

實現三:函數 + 復制

  • 函數調用產生新對象,對其新對象操作之后返回

  • 性能損耗比較大

function produce(obj, recipe) {
  const newObj = { ...obj };
  recipe(newObj);
  return newObj;
}
const obj = {
  name: "云牧"
};
const newObj = produce(obj, draft => {
  draft.name = "黛玉";
});
console.log(newObj); // { name: '黛玉' }
console.log(obj); // { name: '云牧' }

實現四:Proxy代理

function produce(obj, recipe) {
  const state = {
    base: obj, // 基礎對象
    copy: {}, // 被更改后的對象
    draft: {}, // 代理對象
    currentKey: 0 // 當前操作的key
  };
  const handlerItem = {
    get(target, property, receiver) {
      // 如果更改后的對象存在則使用copy
      if (state.copy[state.currentKey]) {
        return state.copy[state.currentKey][property];
      }
      return state.base[state.currentKey][property];
    },
    set(target, property, value, receiver) {
      Reflect.set(state.copy[state.currentKey], property, value);
    }
  };
  const handler = {
    get(target, property, receiver) {
      state.currentKey = property;
      if (!state.draft[property]) {
        const val = { ...state.base[property] };
        const proxy = new Proxy(val, handlerItem);
        state.draft[property] = proxy;
        state.copy[property] = val;
      }
      return state.draft[property];
    },
    set(target, property, value, receiver) {
      return Reflect.set(state.copy, property, value);
    }
  };
  const proxyObj = new Proxy(obj, handler);
  recipe(proxyObj);
  return proxyObj;
}
const arrObj = Array.from({ length: 100 }, (v, index) => ({ name: "云牧" + index }));
const newObj = produce(arrObj, draft => {
  draft[50].name = "黛玉";
});
console.log(newObj[50].name); // 黛玉
console.log(arrObj[50].name); // 云牧50

實現五:第三方不可變對象

  • JS沒有不可變結構,我們一般可以使用 Immutable.jsimmerjs

  • Immutable.js 需要學習他的數據格式操作,且其不可變數據需要 toJS 才能得到原生對象,心智負擔大

  • immerjs 則沒有這方面的問題,且體積更為小巧

關于“Proxy的不可變數據優點及使用方法是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

墨脱县| 湖北省| 阿拉善盟| 普定县| 定日县| 马尔康县| 常州市| 乾安县| 额济纳旗| 宁远县| 夏津县| 郸城县| 南华县| 喜德县| 辛集市| 康定县| 永顺县| 治多县| 辉县市| 沐川县| 噶尔县| 长宁区| 分宜县| 西昌市| 确山县| 南陵县| 柳林县| 文水县| 玉溪市| 武清区| 城口县| 泾川县| 云霄县| 渭源县| 郯城县| 海安县| 彭山县| 天水市| 衡阳市| 鹿泉市| 绥滨县|