es6基礎0x021:反射

0x000 概述

反射說起來和上一章節的代理基本一樣,只是使用的方式不同,設計理念也不同。

反射提供了一系列的靜態函數,可以使用Reflect.function_name(...prams)調用,這一系列的方法和代理處理器對象方法一致

0x001 apply

  • 語法

    Reflect.apply(target, thisArgument, argumentsList)
    • 參數:

      • target:目標
      • thisArgument:調用的上下文
      • argumentList:參數列表
  • 栗子

    function sayHelloTo(name, age){
        console.log(`hello ${name}, i am ${this.name}, ${age} years old now`)
    }
    let obj={
        name: 'jack'
    }
    Reflect.apply(sayHelloTo, obj, ['jack', 23])
    // hello jack, i am jack, 23 years old now

0x002 construct

  • 語法

    Reflect.construct(target, argumentsList[, newTarget])
    • target:目標
    • argumentsList:參數列表
    • newTarget:新的目標
  • 栗子

    function Person(name){
        console.log(`Person ${name}`)
    }
    let obj={age:23}
    Reflect.construct(Person,['jack'])
    // Person jack

0x003 getOwnPropertyDescriptor

  • 語法

    Reflect.getOwnPropertyDescriptor(target, propKey)
    • target:目標
    • propKey:屬性值
  • 栗子

    let obj={name:'jack'}
    Reflect.getOwnPropertyDescriptor(obj, 'name')
    // {value: "jack", writable: true, enumerable: true, configurable: true}

0x004 defineProperty

  • 語法

    Reflect.defineProperty(target, propertyKey, attributes)
    • target:目標
    • propertyKey:屬性名
    • attributes:屬性描述
  • 栗子

    let obj={}
    Reflect.defineProperty(obj,'name',{value:'jack'})
    console.log(obj) // {name:'jack'}

0x005 deleteProperty

  • 語法

    Reflect.deleteProperty(target, propertyKey)
    • target:目標
    • propertyKey:屬性名
  • 栗子

    let obj={name:'jack'}
    Reflect.deleteProperty(obj, 'name')
    // true

0x006 ownKeys

  • 語法

    Reflect.ownKeys(target)
    • target:目標
  • 栗子

    Reflect.ownKeys({name:'jack'})
    // ["name"]

0x007 has

  • 語法

    Reflect.has(target, propertyKey)
    • target:目標
    • propertyKey:屬性名
  • 栗子

    Reflect.has({name:'jack'},'name')
    // true
    Reflect.has({name:'jack'},'age')
    // false

0x008 get

  • 語法

    Reflect.get(target, propertyKey[, receiver])
    • target:目標
    • propertyKey:屬性名
    • receiver:接收者
  • 栗子

    let obj={name:'jack'}
    Reflect.get(obj, 'name')
    // "jack"

0x009 preventExtensions

  • 語法

    Reflect.preventExtensions(target)
    • target:目標
  • 栗子

    Reflect.ownKeys({name:'jack',age:'23'})
    // (2) ["name", "age"]

0x009 isExtensible

  • 語法

    Reflect.isExtensible(target)
    • target:目標
  • 栗子

    Reflect.isExtensible({})
    // true
    Reflect.isExtensible(Object.seal({}))
    // false
    Reflect.isExtensible(Object.freeze({}))
    // false
    let obj=Reflect.preventExtensions({})
    Reflect.isExtensible(obj)
    // false

0x011 preventExtensions

  • 語法

    Reflect.preventExtensions(target)
    • target:目標
  • 栗子

    Reflect.ownKeys({name:'jack',age:'23'})
    // (2) ["name", "age"]

0x012 setPrototypeOf

  • 語法

    Reflect.setPrototypeOf(target, prototype)
    • target:目標
    • prototype:要設置的 prototype
  • 栗子

    Reflect.setPrototypeOf(obj, Array)
    Reflect.getPrototypeOf(obj)
    // ƒ Array() { [native code] }
    

0x013 getPrototypeOf

  • 語法

    Reflect.getPrototypeOf(target)
    • target:目標
  • 栗子

    Reflect.getPrototypeOf([])
    // [constructor: ƒ, concat: ƒ, copyWithin: ƒ, fill: ƒ, find: ƒ, …]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章