Object.defineProperty или .prototype?

Я видел два разных метода реализации не нативных функций в javascript. Первый:

if (!String.prototype.startsWith) {
    Object.defineProperty(String.prototype, 'startsWith', {
        enumerable: false,
        configurable: false,
        writable: false,
        value: function(searchString, position) {
            position = position || 0;
            return this.lastIndexOf(searchString, position) === position;
        }
    });
}

а второй это:

String.prototype.startsWith = function(searchString, position) {
    position = position || 0;
    return this.lastIndexOf(searchString, position) === position;
}

Я знаю, что второй используется для присоединения любого метода к цепочке прототипов определенных стандартных встроенных объектов, но первый метод для меня новый. Кто-нибудь может объяснить, в чем разница между ними, почему кто-то используется, а почему нет, и каковы их значения.

Ответы на вопрос(1)

Ваш ответ на вопрос