Object.defineProperty ou .prototype?

Eu vi duas técnicas diferentes de implementação de recursos não nativos em javascript. Primeiro, é:

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;
        }
    });
}

e segundo é:

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

Eu sei que o segundo é usado para anexar qualquer método à cadeia de protótipos de objetos internos padrão específicos, mas a primeira técnica é nova para mim. Alguém pode explicar qual é a diferença entre eles, por que alguém é usado e por que não e quais são seus significados.

questionAnswers(1)

yourAnswerToTheQuestion