code: function getPropType(prop) {  // {{{2
  /**
   * Return property descriptor type of "prop". (exports.PD_TYPE.data || exports.PD_TYPE.accessor || exports.PD_TYPE.object)
   */
  
    if ((prop === null) || Array.isArray(prop)) {
      return exports.PD_TYPE.object;
    }
  
    var result = exports.PD_TYPE.none;
  
    for (var key in prop) {
      switch (key) {  // Find if "prop" is property descriptor.
      case 'configurable':
      case 'enumerable':
        if (typeof prop[key] !== 'boolean') return exports.PD_TYPE.object;
        if (result === exports.PD_TYPE.none) result = exports.PD_TYPE.descriptor
        break;
      case 'placeholder':
        if ((result === exports.PD_TYPE.data) || (typeof prop[key] !== 'function')) return exports.PD_TYPE.object;
        result = exports.PD_TYPE.accessor;
        break;
      case 'get':
      case 'set':
        if ((result === exports.PD_TYPE.data) || (typeof prop[key] !== 'function')) return exports.PD_TYPE.object;
        result = exports.PD_TYPE.accessor;
        break;
      case 'writable':
        if (typeof prop[key] !== 'boolean') return exports.PD_TYPE.object;
        // Do not break, continue to next case.
      case 'value':
        if (result === exports.PD_TYPE.accessor) return exports.PD_TYPE.object;
        result = exports.PD_TYPE.data;
        break;
      default:  // "prop" is not property descriptor.
        return exports.PD_TYPE.object;
      }
    }
  
    if (result === exports.PD_TYPE.none) {
      return exports.PD_TYPE.object;  // Empty object is not property descriptor.
    }
  
    return result;
  }
docs: All contants