Object.defineProperty oder .prototype?

Ich habe zwei verschiedene Techniken zur Implementierung von nicht-nativen Funktionen in Javascript gesehen. Erstens:

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

und an zweiter Stelle steht:

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

Ich weiß, dass mit der zweiten Methode eine beliebige Methode an die Prototypenkette eines bestimmten integrierten Standardobjekts angehängt wird, aber die erste Technik ist für mich neu. Kann jemand erklären, was der Unterschied zwischen ihnen ist, warum man benutzt und warum man nicht und was ihre Bedeutungen sin

Antworten auf die Frage(2)

Ihre Antwort auf die Frage