Vorwort
Durch die Methoden CALL (), Apply () und Bind () können wir Methoden leicht von anderen Objekten ausleihen, ohne sie von diesen Objekten zu erben.
Ausleihenmethoden in JavaScript
In JavaScript können Funktionen oder Methoden anderer Objekte manchmal wiederverwendet und nicht unbedingt auf dem Objekt selbst oder im Prototyp definiert werden. Durch die Methoden CALL (), Apply () und Bind () können wir Methoden problemlos von anderen Objekten ausleihen, ohne sie zu erben. Dies ist eine gemeinsame Methode, die von professionellen JavaScript -Entwicklern verwendet wird.
Prototypmethode
In JavaScript, mit Ausnahme von unveränderlichen primitiven Datentypen wie String, Anzahl und Boolean, sind fast alle Daten Objekte. Array ist ein Objekt, das zum Überqueren und Konvertieren geordneter Sequenzen geeignet ist. Sein Prototyp verfügt über benutzerfreundliche Methoden wie Slice, Join, Push und Pop.
Ein häufiges Beispiel ist, dass Objekte, wenn sowohl Objekte als auch Arrays Datenstrukturen des Listentyps sind, Methoden von Arrays "ausleihen" können. Die häufigste Methode zum Ausleihen ist Array.prototype.slice .
Funktion myfunc () {// Fehler, Argumente sind ein Array -ähnliches Objekt, kein reales Array -Argumente.sort (); // "liehen" die Array -Methode aus ihrem Prototyp, das ein Array -ähnliches Objekt (Schlüssel: Wert) // nimmt und ein reales Array var args = array.prototype.slice.call (Argumente) zurückgibt; // args ist jetzt ein echtes Array, kann also die Sort () -Methode von Array args.sort () verwenden. } myfunc ('bananas', 'cherries', 'apples');Ausleihenmethoden funktionieren, da die Anruf- und Anwendung von Methoden Aufruffunktionen in verschiedenen Kontexten ermöglichen, was auch eine gute Möglichkeit ist, vorhandene Funktionen wiederzuverwenden, ohne andere Objekte erben zu müssen. Tatsächlich definieren Arrays viele häufige Methoden in Prototypen wie Join und Filter:
// Nehmen Sie eine Zeichenfolge "ABC" und produziert "a | b | barray.prototype.join.call ('abc', '|'); // Nehmen Sie eine String und entfernt alle Nicht -VowelsArray.Prototypen.filter.call ('AbcDefghijk', Funktion (val) {zurück). ! == -1;}). Join (''); Es ist ersichtlich, dass nicht nur Objekte Array -Methoden ausleihen können, sondern auch Zeichenfolgen. Da jedoch generische Methoden im Prototyp definiert sind, müssen Sie String.prototype oder Array.prototype jedes Mal verwenden, wenn Sie eine Methode ausleihen möchten. Das Schreiben wie dieses ist sehr ausführlich und wird bald nervig. Ein effizienterer Weg ist es, Literale zu verwenden, um den gleichen Zweck zu erreichen.
Verwendung wörtlicher Kreditverfahren
Literale sind eine Syntaxstruktur, die JavaScript -Regeln folgt. MDN erklärt sie so:
In JavaScript kann die Verwendung von Literalen Werte darstellen. Sie sind feste Werte, entweder Variablen oder buchstäblich im Skript angegeben.
Literale können als Prototyp abgekürzt werden:
[] .slice.call (Argumente); [] join.call ('ABC', '|'); ''. Touppercase.call (['Kleinbuchstaben', 'Wörter', 'in', 'a', 'Satz']). Split (',');Dies scheint nicht so ausführlich zu sein, aber es ist immer noch ein bisschen hässlich, direkt auf [] und "" die Methode auszuleihen. Sie können Variablen verwenden, um Verweise auf Literale und Methoden zu speichern, was das Schreiben erleichtert:
var Slice = [] .Slice; Slice.call (Argumente); var join = [] .Join; join.call ('ABC', '|'); var touppercase = '' .touppercase; touppercase.call (['Kleinbuchstaben', 'Wörter', 'in', 'a', 'Satz']. Split (',');Mit Verweise auf Leihmethoden können wir es problemlos mit Call () aufrufen, wodurch auch der Code wiederverwendet wird. Wenn wir uns an das Prinzip der Redundierung der Redundanz einhalten, lassen Sie uns prüfen, ob wir Methoden ausleihen können, ohne Call () oder anzuwenden () jedes Mal, wenn wir anrufen:
var Slice = function.prototype.call.bind (array.prototype.slice); Slice (Argumente); var join = function.prototype.call.bind (array.prototype.join); join ('ABC', '|'); var touppercase = function.prototype.call.bind (string.prototype.touppercase); touppercase (['Kleinbuchstaben', 'Wörter', 'in', 'a', 'Satz']). split (',', '); Wie Sie sehen können, können Sie jetzt Function.prototype.call.bind verwenden, um die "geliehene" Methode statisch aus verschiedenen Prototypen zu binden. Aber wie funktioniert der Satz var slice = Function.prototype.call.bind(Array.prototype.slice) tatsächlich?
Function.prototype.call.bind verstehen
Function.prototype.call.bind mag auf den ersten Blick ein bisschen kompliziert erscheinen, aber es kann sehr hilfreich sein, zu verstehen, wie es funktioniert.
Function.prototype.call ist eine Referenz, die eine Funktion "aufruft" und ihren Wert für die Verwendung in einer Funktion festlegt.
Beachten Sie, dass "Bind" eine neue Funktion mit ihrem "This" -Wert zurückgibt. Daher ist das von .bind(Array.prototype.slice) zurückgegebene neue Funktion immer die Funktion von Array.Prototype.slice.
Zusammenfassend lässt sich sagen, dass die neue Funktion die Funktion "Aufruf" aufruft, und ihre "This" ist die "Slice" -Funktion. Das Aufrufen von Slice () verweist auf die zuvor qualifizierte Methode.
Methoden zum Anpassen von Objekten
Die Vererbung ist großartig, aber Entwickler verwenden sie normalerweise, wenn sie einige gemeinsame Merkmale zwischen Objekten oder Modulen wiederverwenden möchten. Es ist nicht erforderlich, die Vererbung nur für die Wiederverwendung von Code zu verwenden, da in den meisten Fällen einfache Kreditverfahren kompliziert werden können.
Wir haben erst zuvor die Ausleihe für die Ausleihe für native Methoden diskutiert, aber die Ausleihe für eine Methode ist in Ordnung. Der folgende Code kann beispielsweise die Spieler -Punktzahl des Punktes -Spiels berechnen:
var ScoreCalculator = {getum: function (resultation) {var Score = 0; für (var i = 0, len = results.length; i <len; i ++) {Score = Score+Ergebnisse [i]; } Return Score; }, getCore: function () {return scorecalculator.getSum (this.Results) / this.handicap; }}; var player1 = {Ergebnisse: [69, 50, 76], Handicap: 8}; var Player2 = {Ergebnisse: [23, 4, 58], Handicap: 5}; var Score = function.prototype.call.bind (scorecalculator.getScore); // Punktzahl: 24.375Console.log ('Score:' + Score (Player1)); // Score: 17console.log ('Score:' + Score (Player2));Obwohl das obige Beispiel sehr stumpf ist, ist ersichtlich, dass benutzerdefinierte Methoden genau wie native Methoden leicht ausgeliehen werden können.
Zusammenfassen
Anruf, Binden und Bewerben können die Art und Weise ändern, wie Funktionen aufgerufen werden und häufig bei Kreditfunktionen verwendet werden. Die meisten Entwickler sind mit der Ausleihe für native Methoden vertraut, aber selten kundenspezifische Methoden ausleihen.
In den letzten Jahren hat sich die funktionale Programmierung von JavaScript gut entwickelt. Wie verwendet ich Funktion.Prototype.call.bind, um die Methode bequemer auszuleihen? Es wird geschätzt, dass solche Themen immer häufiger werden.
Das obige ist die Zusammenfassung der Kreditmethoden in JavaScript. Ich hoffe, es wird für alle hilfreich sein, die Kreditmethoden in JavaScript zu verstehen.