iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0
Modern Web

分手前端菜雞之旅@非洲30天系列 第 6

為什麼 Vue 要使用Proxy 之 Reflect-D06

  • 分享至 

  • xImage
  •  

為什麼 Vue 要使用Proxy 之 Reflect

探討Proxy之前,得先來看看和Proxy一起搭配的Reflect

Reflect(反射)是ES6語法(我真的是寫了這麼久JS還是有好多不懂...)

顧名思義就是可以反射出自身狀態,JS其實已經有類似可以反射自己的方法可用,

譬如說:Object.keys(可以查找自己的屬性)

他是一個內建的物件,有很多靜態語法(不用new 建構就可以直接使用)

Reflect常用的靜態方法有:

Reflect.apply()
Reflect.construct()
Reflect.get()
Reflect.set()
Reflect.defineProperty()

是不是跟Object很像?可以到MDN 這裡
看看Reflect和Object之間細微的差異


環遊非洲第06天:非洲101 之Q

猜猜非洲哪個國家率先在2021年推出數位貨幣?(很潮吧!先進國家都還沒有正式發行)
A.肯亞
B.南非
C.奈及利亞
D.埃及


要Reflect幹嘛?

譬如說我們昨天使用Object的defineProperty,

如果我們將物件設置為靜態只能讀取的話,

當我們要賦值的時候,我們不會知道有沒有賦值成功,

但使用Reflect.defineProperty(),因為返回的是布林值,我們就可以輕鬆知道結果。

const myObject = {}

let country = "Nigeria";
Object.defineProperty(myObject, "name", {
  get() { 
    console.log("有人讀取了");
    return country; 
  },
});

myObject.name = "South Africa" //沒反應
Reflect.set(myObject, 'name', 'South Africa') //得到false

Reflect 常用靜態方法:get, set , defineProperty

1.Reflect.defineProperty

語法:Reflect.defineProperty(target, propertyKey, attributes)

Object.defineProperty 用法差不多

返回:布林值說明有沒有設置成功

摘錄MDN案例

let myObject = {}

//可以做判斷式看有沒有設置成功,因為Reflec會返回boolean
if(Reflect.defineProperty(myObject, "name", {value: "South Africa"}))
{
    console.log("Property created successfully!");
}else{
    console.log("failed");
}

//Property created successfully!

console.log(myObject.name); //output: South Africa

2. & 3. Reflect.get & set

語法:

Reflect.get(target, propertyKey, receiver)

Reflect.set(target, propertyKey, value, receiver)

返回屬性的值

這邊特別說明一下receiver功能,如果有設定receiver,使用setter時會調用this的值

這邊使用MDN的例子:

//1.
const target = {};
const receiver = {};
Reflect.set(target, "a", 2, receiver); // true
// target is {}; receiver is { a: 2 }

//2.
const target = { a: 1 };
const receiver = {};
Reflect.set(target, "a", 2, receiver); // true
// target is { a: 1 }; receiver is { a: 2 }


//3.傳入Receiver,調用this指向Receiver本身
const target = {
    set a(v) {
        this.b = v; 
    } 
};
const receiver = {};
Reflect.set(target, "a", 2, receiver); // true
// target is {}裡面有 a 的setter; receiver is { b: 2 }

Reciever搭配Proxy可以保持this指向的一致性

明天就來看看Proxy搭配Refect 可以幫我們的物件監聽達到什麼效果!

看看Reflect和Object之間細微的差異


環遊非洲第06天:非洲101 之A

答案是C奈及利亞!
由國家的央行所推出的數位貨幣叫做:央行數位貨幣CBDC
CBDC潛在的效益有:改進跨境支付問題、開立使用方便利於經濟弱勢民眾、使用範圍廣...
雖然奈及利亞搶在2021年十月開啟了數位貨幣,但至今他幣值仍低、使用率也不高,
也被國際組織警告可能會有洗錢風險。(奈及利亞的網路詐騙世界有名)
台灣央行也積極在測試和討論數位貨幣的可能性,
奈及利亞的案例也可以當作參考呢。

How has Nigeria’s digital currency fared since its launch?
台灣央行數位貨幣進程整理|CBDC有何效益及風險?試驗進度到哪階段?


參考


上一篇
分手JS-可以數據監聽的DefineProperty與Vue2-D05
下一篇
為什麼 Vue 要使用Proxy -D07
系列文
分手前端菜雞之旅@非洲30天30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言