Reflect对象介绍
- Reflect对象是一个全局的普通对象,为何强调普通呢,因为他不像其他原生值(比如Number、String等)是函数/构造器。Reflect的原型就是Object,可以尝试在控制台输入以下代码查看:
let obj = {}, str = ""
Reflect.__proto__ === Object.prototype // true
obj.__ proto__ === Reflect.__proto__ // true
str.__proto__ // String {"", mulReplace: ƒ, format: ƒ, tmpl: ƒ, contains: ƒ, dbc2sbc: ƒ, …}
- Reflect对象的属性成员都是函数,其中一部分与Object上的同名函数类似:
- Reflect.getOwnPropertyDescriptor(...)
- Reflect.defineProperty(...)
- Reflect.getPrototypeOf(...)
- Reflect.setPrototypeOf(...)
- Reflect.preventExtensions(...)
- Reflect.isExtensible(...)
Reflect函数与Object.*的区别
- 这些Reflect与Object同名的函数,接收参数、功能等方面都是相同的,但是具体表现还是有区别,接下来说下:
-
1,此类函数接收的第一个参数(目标对象)如果不是对象类型的,Object.* 会尝试把它转换为对象,而Reflect.* 则会直接跑出一个错误。
image.png
- 2,然后对某些不可扩展的对象执行
defineProperty
函数时,Object.defineProperty
会抛出一个错误,Reflect.defineProperty
则会返回一个false
image.png
-
函数行为API
- Reflect部分api为js语言提供了一种函数式的写法来等价替换命令式的写法,比如:
let obj = {a:1}
Reflect.has(obj, 'a')
// 相当于
'a' in obj
Reflect.get(obj, 'a')
// 相当于
obj.a
Reflect.set(obj, 'b', 2)
// 相当于
obj.b = 2
Reflect.deleteProperty(obj, 'b')
// 相当于
delete obj.a
Reflect.construct(String, ['str'])
// 相当于
new String('str')
- Reflect还有其他一些API,具体可参考MDN。
- Reflect还有一个重要的作用就是结合Proxy,后面再补充。
网友评论