2017-06-19 185 views
3

無法理解爲什麼我應該使用Reflect.get(obj, 'foo')而不是obj['foo'],或者爲什麼第一個是有用的,因爲我們可以使用good和good來做同樣的事情舊對象括號表示法。有人可以詳細說明嗎?JavaScript:Reflect.get()和obj ['foo']之間的區別

var obj = {foo: 'bar'}; 
obj['foo']; 
Reflect.get(obj, 'foo'); 
+0

*「Reflect.get'方法允許你在一個對象上獲得一個屬性,就像屬性訪問器的語法是一個函數一樣。」* - 就是這麼多。這是同樣的事情,但作爲一個功能。可以在函數式編程中派上用場。 – deceze

+0

@deceze,但你已經可以創建一個封閉的地方,你可能需要這樣的功能... – Jon

+0

@Jon當然,但這是一個內置的! ...是的,這就是我得到的。 – deceze

回答

3

好了,迂腐回答你的問題是,他們是完全不同的:屬性訪問返回參考一個屬性,而Reflect.get返回其

從實際的角度來看,沒有任何區別,因爲屬性引用總是在右側取消引用。

Reflect.get的一個實際用法將與其第三個參數結合使用,該參數與Proxy結合後可用於創建同一數據的不同「視圖」。

let numbersView = obj => new Proxy(obj, { 
 
    get(target, key, receiver) { 
 
     return receiver(target[key]) 
 
    } 
 
}); 
 

 
let decimal = x => String(x); 
 

 
let english = x => { 
 
    if (x === 1) return 'one'; 
 
    if (x === 2) return 'two'; 
 

 
}; 
 

 
let v = numbersView({ 
 
    a: 1, 
 
    b: 2 
 
}); 
 

 
console.log(Reflect.get(v, 'a', decimal)) 
 
console.log(Reflect.get(v, 'a', english))

這個例子是一個有點虛構的,但你有這個想法。

2

沒有區別。

從MDN文檔摘自:

靜態Reflect.get()方法的工作原理是從對象獲取屬性(目標[PROPERTYKEY])爲函數。 Reflect.get() | MDN

唯一的區別是Reflect.get()將拋出一個TypeError如果給定值不是object

obj[prop]將拋出ReferenceError如果obj未定義,否則將只返回undefined

真的,我認爲它只存在給Reflect一個完整的API,但應該沒有壞處,只使用obj[prop]語法。

+0

這不是事實。這裏有一個區別 - Reflect.get()' - _receiver_的第三個可選參數。例如:https://stackoverflow.com/a/39003741/1064570 – Artin

相關問題