反射对象在JavaScript中做什么?

反射对象在JavaScript中做什么?,javascript,ecmascript-6,Javascript,Ecmascript 6,不久前,我在MDN上看到了javascript中Reflect对象的一个空白存根,但我在Google上找不到任何东西。今天我发现了这个,除了领域和加载器功能之外,它听起来与代理对象类似 基本上,我不知道我找到的这个页面是否只是解释了如何实现Reflect,或者我只是不理解它的措辞。有人能大致地向我解释一下反射的方法是什么吗 例如,在我找到的页面上,调用Reflect.apply(target、thisArgument、argumentsList) 将“返回使用参数thisArgument和arg

不久前,我在MDN上看到了javascript中
Reflect
对象的一个空白存根,但我在Google上找不到任何东西。今天我发现了这个,除了领域和加载器功能之外,它听起来与代理对象类似

基本上,我不知道我找到的这个页面是否只是解释了如何实现Reflect,或者我只是不理解它的措辞。有人能大致地向我解释一下
反射的方法是什么吗

例如,在我找到的页面上,调用
Reflect.apply(target、thisArgument、argumentsList)
将“返回使用参数thisArgument和args调用目标的[[Call]]内部方法的结果。”但这与仅调用
target.apply(thisArgument,argumentsList)
有何不同

更新:

感谢@Blue,我在维基上找到了这个页面
据我所知,reflect对象提供了代理可以捕获的所有操作的方法版本,以使转发更容易。但这对我来说似乎有点奇怪,因为我不认为这是完全必要的。但是它看起来有点多,特别是说“代码>双重提升< /代码>,但这指的是旧的代理规范/

通过wiki上找到的草稿文件,

我们得到了草案中澄清的“单一普通对象”这一行。它还具有函数定义

wiki应该是可靠的,因为您可以从emcascript网站找到指向它的链接


不过,我在谷歌上找到了第一个链接,而直接在维基上搜索却没有找到它。

2015年更新: 正如s所指出的,现在ES6(ECMAScript 2015)已经定稿,现在可以获得更合适的文档:


原始答案(用于(历史)理解和额外示例)

反思计划
似乎已经进展到了最后阶段。本文档目前概述了
Reflect
-对象的方法,仅说明了
Reflect
-对象本身的以下内容:

反射对象是单个普通对象。

反射对象的[[Prototype]]内部插槽的值为标准内置对象Prototype对象(19.1.3)。

反射对象不是函数对象。它没有[[Construct]]内部方法;使用new运算符无法将反射对象用作构造函数。反射对象也没有[[Call]]内部方法;无法将反射对象作为函数调用。 然而,关于它的用途,有一个简短的解释:

“@reflect”模块有多种用途:
  • 现在我们有了模块,“@reflect”模块对于之前在对象上定义的许多反射方法来说是一个更自然的地方。 为了向后兼容,对象上的静态方法不太可能消失。但是,新方法可能应该添加到“@reflect”模块,而不是对象构造函数。
  • 代理的天然家,避免了全局代理绑定的需要。
  • 本模块中的大多数方法将一对一映射到代理陷阱。代理处理程序需要这些方法来方便地转发操作,如下所示。


因此,
Reflect
对象提供了许多实用功能,其中许多功能似乎与全局对象上定义的ES5方法重叠

然而,这并不能真正解释它打算解决哪些现有问题,或者添加了哪些功能。我怀疑这可能是垫片,事实上,上述和谐规范链接到一个

检查该代码可以(进一步)了解它的用途,但谢天谢地,还有一个wiki概述了
(我已从该来源复制(并格式化)了以下文本,以供将来参考,因为它们是我能找到的唯一示例。此外,它们很有意义,已经有了很好的解释,并触及了问题的
应用
示例。)


更有用的返回值

Reflect
中的许多操作类似于在
对象上定义的ES5操作,例如
Reflect.getOwnPropertyDescriptor
Reflect.defineProperty
。但是,鉴于
Object.defineProperty(obj,name,desc)
在成功定义属性时将返回
obj
,或者抛出
TypeError
否则,
Reflect.defineProperty(obj,name,desc)
被指定为只返回一个布尔值,指示是否成功定义了属性。这允许您重构此代码:

试试看{
Object.defineProperty(对象、名称、描述);
//已成功定义属性
}捕获(e){
//可能的故障(并且可能意外捕获错误的异常)
}
为此:

if(Reflect.defineProperty(对象、名称、描述)){
//成功
}否则{
//失败
}
返回此类布尔成功状态的其他方法有
Reflect.set
(更新属性)、
Reflect.deleteProperty
(删除属性)、
Reflect.preventExtensions
(使对象不可扩展)和
Reflect.setPrototypeOf
(更新对象的原型链接)


一流运营

在ES5中,检测对象
obj
是否定义或继承某个属性名的方法是写入
(obj中的名称)
。类似地,要删除属性,可以使用
delete obj[name]
。虽然专用语法很好而且很短,但这也意味着当您想首先传递操作时,必须将这些操作显式地包装在函数中