Всё зависит от того, что вам требуется в итоге получить. Конечно же для расширения стандартных типов, то добавляйте функционал через prototype, defineProperty не чем особым не отличается, кроме как своим расширенным функционалом и дополнительными возможностями, которые по факту очень редко необходимы для решения поставленных задач. Первый же метод вообще бесполезен, вы просто затрачиваете лишние ресурсы, создавая дополнительные объекты, хотя в таком случаи исходный объект останется девственно чистым, но зачем он вам, если не быть криворуким то и без него всё будет работать.
А на последний вопрос:
https://developer.mozilla.org/en-US/...defineProperty
http://caniuse.com/#search=defineProperty
И ещё в дополнение:
http://jsperf.com/object-defineproperty-test