与大多数全局对象不同,
Reflect不是一个构造函数。
不能将其与一个new运算符一起使用,
不能将Reflect对象作为一个函数来调用。
Reflect的所有属性和方法都是静态的。
Reflect对象的设计目的有这样几个:
(1) 将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到Reflect对象上。现阶段,某些方法同时在Object和Reflect对象上部署,未来的新方法将只部署在Reflect对象上。也就是说,从Reflect对象上可以拿到语言内部的方法。
(2) 修改某些Object方法的返回结果,让其变得更合理。比如,Object.defineProperty(obj, name, desc)在无法定义属性时,会抛出一个错误,而Reflect.defineProperty(obj, name, desc)则会返回false。
(3) 让Object操作都变成函数行为。某些Object操作是命令式,比如name in obj和delete obj[name],而Reflect.has(obj, name)和Reflect.deleteProperty(obj, name)让它们变成了函数行为。
(4)Reflect对象的方法与Proxy对象的方法一一对应,只要是Proxy对象的方法,就能在Reflect对象上找到对应的方法。
Reflect对象提供以下静态函数:
Reflect.apply()
对一个函数进行调用操作,同时可以传入一个数组作为调用参数。和 Function.prototype.apply() 功能类似。
Reflect.construct()
对构造函数进行 new 操作,相当于执行 new target(...args)。
Reflect.defineProperty()
和 Object.defineProperty() 类似。
Reflect.deleteProperty()
作为函数的delete操作符,相当于执行 delete target[name]。
Reflect.get()
获取对象身上某个属性的值,类似于 target[name]。
Reflect.getOwnPropertyDescriptor()
类似于 Object.getOwnPropertyDescriptor()。
Reflect.getPrototypeOf()
类似于 Object.getPrototypeOf()。
Reflect.has()
判断一个对象是否存在某个属性,和 in 运算符 的功能完全相同。
Reflect.isExtensible()
类似于 Object.isExtensible().
Reflect.ownKeys()
返回一个包含所有自身属性(不包含继承属性)的数组。(类似于 Object.keys(), 但不会受enumerable影响).
Reflect.preventExtensions()
类似于 Object.preventExtensions()。返回一个Boolean。
Reflect.set()
将值分配给属性的函数。返回一个Boolean,如果更新成功,则返回true。
Reflect.setPrototypeOf()
类似于 Object.setPrototypeOf()。
在 JavaScript 中,Reflect 是一个内置的全局对象,对一些函数式的操作提供了面向对象的 API。 Reflect 不是一个函数对象,因此它是不可构造的。它所有的方法都是静态的,类似于 Math 对象。
目前共13个静态方法 可以分为函数相关,原型相关,对象相关三大类。
Reflect && Object的某些方法是相似甚至相同的,可能有的同学会问,为什么不直接把Reflect的方法放在Object上呢?何必新加一个对象?两者到底有什么区别?
所以当Reflect和Object方法能实现同样效果时 我们建议优先使用Reflect
在有了上面的一些基本了解后 我们再来谈下Reflect的设计目的:
基本操作包括属性访问和赋值、属性删除、枚举、函数调用、对象构造等等 例如:
即使在特定环境下目标函数的某些行为被覆盖或修改了 Reflect对象依然是调用语言的内部基本操作,而不受外部环境的影响。当然我们通过其他方式也是可以做到的 只是麻烦了一点...
元编程是指编写可以操作或改变其他程序的程序。元编程可以改变 JavaScript 的一些基本操作的行为。主要与这三个对象有关。Symbol:通过内置Symbol值复写 js语言中的基本操作。Reflect:可以获取语言内部的基本操作。Proxy:通过钩子函数 拦截&改变 js语言的基本操作。
这段代码展示了如何使用Proxy对象来拦截对底层对象的操作。
通过这种方法,可以在执行实际操作之前或之后插入自定义行为。这里拦截了三种操作:属性的获取 (get)、设置 (set) 和删除 (deleteProperty)。
与大多数全局对象不同,
Reflect不是一个构造函数。
不能将其与一个new运算符一起使用,
不能将Reflect对象作为一个函数来调用。
Reflect的所有属性和方法都是静态的。
Reflect对象的设计目的有这样几个:
(1) 将Object对象的一些明显属于语言内部的方法(比如Object.defineProperty),放到Reflect对象上。现阶段,某些方法同时在Object和Reflect对象上部署,未来的新方法将只部署在Reflect对象上。也就是说,从Reflect对象上可以拿到语言内部的方法。
(2) 修改某些Object方法的返回结果,让其变得更合理。比如,Object.defineProperty(obj, name, desc)在无法定义属性时,会抛出一个错误,而Reflect.defineProperty(obj, name, desc)则会返回false。
(3) 让Object操作都变成函数行为。某些Object操作是命令式,比如name in obj和delete obj[name],而Reflect.has(obj, name)和Reflect.deleteProperty(obj, name)让它们变成了函数行为。
(4)Reflect对象的方法与Proxy对象的方法一一对应,只要是Proxy对象的方法,就能在Reflect对象上找到对应的方法。
Reflect对象提供以下静态函数:
Reflect.apply()
对一个函数进行调用操作,同时可以传入一个数组作为调用参数。和 Function.prototype.apply() 功能类似。
Reflect.construct()
对构造函数进行 new 操作,相当于执行 new target(...args)。
Reflect.defineProperty()
和 Object.defineProperty() 类似。
Reflect.deleteProperty()
作为函数的delete操作符,相当于执行 delete target[name]。
Reflect.get()
获取对象身上某个属性的值,类似于 target[name]。
Reflect.getOwnPropertyDescriptor()
类似于 Object.getOwnPropertyDescriptor()。
Reflect.getPrototypeOf()
类似于 Object.getPrototypeOf()。
Reflect.has()
判断一个对象是否存在某个属性,和 in 运算符 的功能完全相同。
Reflect.isExtensible()
类似于 Object.isExtensible().
Reflect.ownKeys()
返回一个包含所有自身属性(不包含继承属性)的数组。(类似于 Object.keys(), 但不会受enumerable影响).
Reflect.preventExtensions()
类似于 Object.preventExtensions()。返回一个Boolean。
Reflect.set()
将值分配给属性的函数。返回一个Boolean,如果更新成功,则返回true。
Reflect.setPrototypeOf()
类似于 Object.setPrototypeOf()。