constructor (path, offset) {
    // HACK: to allow this class be inherited but without calling this ctor
    if (arguments[0] === 'SKIP') return
    if (arguments.length === 1) {
      const data = arguments[0]
      this.path = data.path
      this.offset = data.offset
    } else {
      this.path = path
      this.offset = offset
    }
    if (!isArray(this.path)) {
      throw new Error('Invalid arguments: path should be an array.')
    }
    if (!isNumber(this.offset) || this.offset < 0) {
      throw new Error('Invalid arguments: offset must be a positive number.')
    }
  }
@param {Array} path the address of a property, such as ['text_1', 'content']
   @param {int} offset the position in the property