2017-06-19 168 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

相关问题