美文网首页
ES6 Reflect对象

ES6 Reflect对象

作者: ITgecko | 来源:发表于2018-09-26 23:03 被阅读0次
    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,后面再补充。

    相关文章

      网友评论

          本文标题:ES6 Reflect对象

          本文链接:https://www.haomeiwen.com/subject/sasroftx.html