ES6 Reflect对象

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,后面再补充。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容