считай это перегрузкой операторов, звоня в функцию вызывается функция, при сравнение с числом вызывается valueOf/toString и сравнивается результат
было бы неплохо перегрузить тип число и обработать вызов его как функции, но наверное так всё же нельзя, разве что прокси какое-нибудь) код пишешь неплохо вроде, но объясняешь как этот самый код работает сложновато и непоследовательно