use Object.defineProperty instead of prototype directly to prevent enumeration