text: /* @flow */
  
  export const emptyObject = Object.freeze({})
  
  /**
   * Check if a string starts with $ or _
   */
  export function isReserved (str: string): boolean {
    const c = (str + '').charCodeAt(0)
    return c === 0x24 || c === 0x5F
  }
  
  /**
   * 封装的 定义属性的方法，内部借助了 Object.defineProperty()
   */
  export function def (obj: Object, key: string, val: any, enumerable?: boolean) {
    Object.defineProperty(obj, key, {
      value: val,
      enumerable: !!enumerable,
      writable: true,
      configurable: true
    })
  }
  
  /**
   * Parse simple path.
   */
  const bailRE = /[^\w.$]/
  export function parsePath (path: string): any {
    if (bailRE.test(path)) {
      return
    }
    const segments = path.split('.')
    return function (obj) {
      for (let i = 0; i < segments.length; i++) {
        if (!obj) return
        obj = obj[segments[i]]
      }
      return obj
    }
  }
  