Object.defineProperty o .prototype?

He visto dos técnicas diferentes de implementación de características no nativas en javascript, la primera es:

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

y segundo es:

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

Sé que el segundo se usa para unir cualquier método a la cadena de prototipo de un objeto incorporado estándar en particular, pero la primera técnica es nueva para mí. ¿Alguien puede explicar cuál es la diferencia entre ellos, por qué se usa uno y por qué no, y cuáles son sus significados?

Respuestas a la pregunta(1)

Su respuesta a la pregunta