中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

vue3中的Proxy為什么一定要用Reflect

發布時間:2023-04-24 16:38:48 來源:億速云 閱讀:101 作者:iii 欄目:開發技術

這篇文章主要介紹“vue3中的Proxy為什么一定要用Reflect”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“vue3中的Proxy為什么一定要用Reflect”文章能幫助大家解決問題。

用過vue的知道,vue的響應實現用的Proxy,且里面是配合Reflect用的,查看Proxy和Reflect文檔最顯眼的是Reflect對象的靜態方法和Proxy代理方法的命名相同,Reflect可以操作對象使用, proxy可以代理對象,但沒有找到為啥有時一定要在Proxy代理方法中使用Reflect

基本操作

Reflect對象的靜態方法和Proxy代理方法的命名相同,都有13種,示例get,set如下

const tempObj = { a: 1 };
Reflect.get(tempObj, 'a'); // 返回 1
Reflect.set(tempObj, 'a', 2); // 返回true 表示設置成功, a的值變2

const tempObj1 = { a: 1 };
const handler = {
  get: function (obj, prop, receiver) {
    return prop === 'a' ? 1000 : obj[prop];
  },
  set: function (obj, prop, value, receiver) {
    console.log(prop);
    obj[prop] = prop === 'a' ? 6 : value;
    return true;
  },
};
const proxyObj = new Proxy(tempObj1, handler);
proxyObj.a; // proxyObj => {a: 1000}
proxyObj.a = 2; // proxyObj => {a: 6}

疑問

如果Proxy不做其它操作直接正常返回

const tempObj1 = { a: 1 };
const handler = {
  get: function (obj, prop, receiver) {
    return obj[prop];
  },
  set: function (obj, prop, value, receiver) {
    obj[prop] = value
    return true;
  },
};
const proxyObj = new Proxy(tempObj1, handler);
proxyObj.a; // proxyObj => {a: 1}
proxyObj.a = 2; // proxyObj => {a: 2}

以上面情況完Proxy可以不使用Reflect處理攔截,比使用Reflect簡單多了

不一樣的對象, 帶有get的對象

const tempObj1 = {
  a: 1,
  get value() {
    console.log(this === proxyObj); // false
    return this.a;
  },
};
const handler = {
  get: function (obj, prop, receiver) {
    return obj[prop];
  },
  set: function (obj, prop, value, receiver) {
    obj[prop] = value;
    return true;
  },
};
const proxyObj = new Proxy(tempObj1, handler);
proxyObj.value; // 1

上面value中的打印的值為false,期望的結果應該true, 但應該代理中用的原對象取值所以this指向了原對象,所以值為false

雖然this指錯了,但得到值還是正確定,這不是一定的理由

const parent = {
  a: 1,
  get value() {
    console.log(this === child); // false
    return this.a;
  },
};
const handler = {
  get: function (obj, prop, receiver) {
    return obj[prop];
  },
  set: function (obj, prop, value, receiver) {
    obj[prop] = value;
    return true;
  },
};

const proxyObj = new Proxy(parent, handler);
const child = Object.setPrototypeOf({ a: 2 }, proxyObj);
child.value; // 1

這就有問題了,輸出的結果都和期望的不一樣了,this應該指向child,但指向了parent

Reflect上場

要是Reflect.get(obj, prop)換成obj[prop],這等于沒換,意義和結果是一樣的,這不是還有一個receiver參數沒有用嘛

const parent = {
  a: 1,
  get value() {
    console.log(this === child); // true
    return this.a;
  },
};
const handler = {
  get: function (obj, prop, receiver) {
    Reflect.get(obj, prop)
   - return obj[prop];
   + retrun Reflect.get(obj, prop, receiver)
  },
  set: function (obj, prop, value, receiver) {
   - obj[prop] = value;
   + Reflect.get(obj, prop, value, receiver)
    return true;
  },
};

const proxyObj = new Proxy(parent, handler);
const child = Object.setPrototypeOf({ a: 2 }, proxyObj);
child.value; // 2

this指向正確,結果也當然和期望一致,receiver的不是指代理對象,也不是指原對象,而是執行上下文(有句話是這么說的,不用特定方式改變this的情況下,誰調用指向誰,這就是期望的),這里child調用的value所以期望的指向應該是child, 這里你可能想到直接用receiver[prop]不行了,這樣會出現執行溢出,receiver[prop]相當于child.valuechild.value還沒執行完,receiver[prop]又執行了,就會無限在執行

Reflect.get(target, key, receiver)中的receiver參數修改了this指向,不加this指向target, 加了后指向receiver

代理對象中有用到this時一定要用到Reflect,這樣才能得到一直符合期望的值

總結

vue3中的代理對象到得的都是符合期望的值,在攔截中做了收集和更新,所以一定要在Proxy的攔截函數中使用Reflect處理

怎么一直拿到符合期望的值,代理了像沒有代理一樣

  get: function (...arg) {
    return Reflect.get(...arg);
  },

關于“vue3中的Proxy為什么一定要用Reflect”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。

向AI問一下細節

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

AI

玉山县| 武川县| 阆中市| 滨州市| 礼泉县| 科技| 吉隆县| 黄梅县| 绩溪县| 察哈| 大悟县| 舟曲县| 罗源县| 法库县| 蒲城县| 富民县| 周口市| 开原市| 宁远县| 精河县| 晴隆县| 沧源| 天津市| 嘉善县| 公安县| 湖南省| 康马县| 白水县| 金湖县| 开化县| 济南市| 宝坻区| 荃湾区| 桂平市| 靖江市| 永济市| 措勤县| 东乡县| 陵水| 通山县| 高邑县|