Ну а какие могут быть еще варианты? :)
По первому - если его использовать, то нужно убедиться, что заданный метод отсутствует в
стандарте /
хотя бы одной реализации. Если их аналоги присутствуют там - может лучше реализовать их? Расширять прототипы только используя
defineProperty с enumerable: false, дабы не сломать for-in. Ну и не использовать никакие другие библиотеки, расширяющие build-in объекты, кроме полифилов.
Не устраивает - тогда второе или третье. Они легко совмещаются, см., например, как это реализовано в
undescore.js