2017-06-19 11 views
3

obj['foo']の代わりにReflect.get(obj, 'foo')を使用しなければならない理由がわからないのはなぜですか?古いオブジェクト括弧表記。誰かが詳しく説明できますか?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の実際の使用法の1つは、同じデータの異なる「ビュー」を作成するためにProxyと組み合わせて使用​​する3番目の引数になります。

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

唯一の違いは、与えられた値がobjectでない場合Reflect.get()TypeErrorがスローされますです。

obj[prop]objが定義されていないReferenceError場合スローされますが、それ以外はただundefinedを返します。

実際、Reflectには完全なAPIを提供することしか存在しませんが、obj[prop]構文を使用することには欠点はありません。

+0

それは当てはまりません。差異 - 'Reflect.get()' - _receiver_の3番目のオプションパラメータがあります。例:https://stackoverflow.com/a/39003741/1064570 – Artin

関連する問題