Dieser Artikel ist Teil einer Web Dev Tech -Serie von Microsoft. Vielen Dank, dass Sie die Partner unterstützt haben, die SitePoint ermöglichen.
Während des Entwerfens von babylon.js v2.0 (eine Bibliothek zum Aufbau von 3D im Web) hatte ich kürzlich wünschte, dass mehr APIs fließend wären - das heißt, ich wünschte, die Community könnte leichter lesen, verstehen und aufbauen Die Arbeit verbringt während weniger Zeit in den Tech -Dokumenten. In diesem Tutorial gehe ich durch fließende APIs-was zu beachten ist, wie man sie schreibt und die Auswirkungen auf den Browser-Leistung.
Eine fließende API, wie in diesem Wikipedia-Artikel angegeben, ist eine Implementierung einer objektorientierten API, die darauf abzielt, mehr lesbarer Code zu liefern. JQuery ist zum Beispiel ein gutes Beispiel dafür, was eine fließende API ermöglicht:
<span>$('<div></div>') </span> <span>.html("Fluent API are cool!") </span> <span>.addClass("header") </span> <span>.appendTo("body");</span>
Mit einer fließenden API können Sie die Aufrufe der Kettenfunktion durch zurückgeben. Wenn Sie nicht wissen, wie das Keyword in JavaScript funktioniert, empfehle ich, diesen großartigen Artikel zu lesen.
Wir können leicht eine fließende API wie folgt erstellen:
<span>var <span>MyClass</span> = function(a) { </span> <span>this.a = a; </span><span>} </span> <span>MyClass.prototype.foo = function(b) { </span> <span>// Do some complex work </span> <span>this.a += Math.cos(b); </span> <span>return this; </span><span>}</span>
Wie Sie sehen, geht es bei dem Trick nur darum, das Objekt zurückzugeben (ein Verweis auf die aktuelle Instanz in diesem Fall), damit die Kette fortgesetzt wird.
wir können dann Anrufe ketten:
<span>var obj = new MyClass(5); </span>obj<span>.foo(1).foo(2).foo(3);</span>
Bevor ich versuchte, dasselbe mit babylon.js zu tun, wollte ich sicher sein, dass dies nicht einige Leistungsprobleme generieren würde.
Also habe ich einen Benchmark gemacht!
<span>var count = 10000000; </span> <span>var <span>MyClass</span> = function(a) { </span> <span>this.a = a; </span><span>} </span> <span>MyClass.prototype.foo = function(b) { </span> <span>// Do some complex work </span> <span>this.a += Math.cos(b); </span> <span>return this; </span><span>} </span> <span>MyClass.prototype.foo2 = function (b) { </span> <span>// Do some complex work </span> <span>this.a += Math.cos(b); </span><span>} </span> <span>var start = new Date().getTime(); </span><span>var obj = new MyClass(5); </span>obj<span>.foo(1).foo(2).foo(3); </span><span>for (var index = 0; index < count; index++) { </span> obj<span>.foo(1).foo(2).foo(3); </span><span>} </span><span>var end = new Date().getTime(); </span> <span>var start2 = new Date().getTime(); </span><span>var obj2 = new MyClass(5); </span><span>for (var index = 0; index < count; index++) { </span> obj2<span>.foo2(1); </span> obj2<span>.foo2(2); </span> obj2<span>.foo2(3); </span><span>} </span><span>var end2 = new Date().getTime(); </span> <span>var div = document.getElementById("results"); </span> div<span>.innerHTML += obj.a + ": With return this: " + (end - start) + "ms<BR>"; </span>div<span>.innerHTML += obj2.a + ": Without return this: " + (end2 - start2) + "ms";</span>
Wie Sie sehen können, machen Foo und Foo2 genau dasselbe. Der einzige Unterschied ist, dass Foo gekettet werden kann, während foo2 nicht.
kannOffensichtlich unterscheidet sich die Call -Kette zwischen:
obj<span>.foo(1).foo(2).foo(3);</span>
und:
obj2<span>.foo2(1); </span>obj2<span>.foo2(2); </span>obj2<span>.foo2(3);</span>
Angesichts dieses Codes habe ich ihn auf Chrome, Firefox und IE ausgeführt, um festzustellen, ob ich mir Sorgen um die Leistung machen muss.
Und hier sind die Ergebnisse, die ich erhalten habe:
Ich habe eine Operation in die Funktion (math.cos) hinzugefügt, um eine Art von Verarbeitung zu simulieren, die durch die Funktion durchgeführt wird.
Wenn ich alles entferne und einfach die Rückkehrerklärung aufbewahre, gibt es im gesamten Browser keinen Unterschied (eigentlich nur ein oder zwei Millisekunden für 10.000.000 Versuche). Sie können dies selbst in den Browsern testen. Und wenn Sie die Geräte nicht zur Hand haben, gibt es auf Modern.ie viele kostenlose Tools. Testen Sie einfach keine virtuelle Maschine gegen ein echtes Gerät.
meine Schlussfolgerung lautet also: Es ist ein Go!
fließende APIs sind großartig, sie produzieren mehr lesbarer Code und Sie können sie ohne Probleme oder Leistungsverluste verwenden!
Es könnte Sie vielleicht ein bisschen überraschen, aber Microsoft hat ein paar kostenlose Lernen auf vielen Open -Source -JavaScript -Themen und wir sind auf der Mission, mit Project Spartan Coming viel mehr zu schaffen. Schauen Sie sich meine eigene an:
oder die Lernserie unseres Teams:
und einige kostenlose Tools: Visual Studio Community, Azure Test und Cross-Browser-Test-Tools für Mac, Linux oder Windows.
Dieser Artikel ist Teil der Web Dev Tech -Serie von Microsoft. Wir freuen uns, Projekt Spartan und seinen neuen Rendering -Engine mit Ihnen zu teilen. Holen Sie sich kostenlose virtuelle Maschinen oder testen Sie remote auf Ihrem Mac-, iOS-, Android- oder Windows -Gerät bei Modern.ie.Was ist eine fließende API in JavaScript? Es beinhaltet das Zusammenketten von Methoden in einer Weise, die wie ein Satz oder eine Reihe von Anweisungen liest. Dies wird erreicht, indem sichergestellt wird, dass jede Methode ein Objekt zurückgibt, sodass eine andere Methode sofort aus dem Ergebnis der vorherigen Methode aufgerufen werden kann. Fluent -APIs können Ihren Code sauberer und intuitiver machen, insbesondere wenn Sie mit komplexen Funktionsaufrufen zu tun haben.
Kann ich fließende APIs mit asynchronem Code verwenden? , aber es kann etwas komplexer sein. Sie müssen sicherstellen, dass jede Methode in der Kette ein Versprechen zurückgibt, sodass Sie „.Sen ()“ verwenden können, um Methoden miteinander zu ketten. Alternativ können Sie Async/Auseait Syntax verwenden, um asynchrone Code zu schreiben, der synchron aussieht. Dadurch kann Ihre fließende API leichter zu lesen und zu verstehen.
fließende API ist ein Entwurfsmuster, das sich auf Lesbarkeit und Ausdruckskraft konzentriert. Es kann mit anderen Entwurfsmustern wie dem Builder -Muster verglichen werden, die auch darauf abzielen, Code lesbarer und einfacher zu bearbeiten. Während sich das Builder -Muster Schritt für Schritt auf die Konstruktion komplexer Objekte konzentriert, konzentriert sich die Fluent -API auf die Kette für einen lesbaren Betriebsfluss. >Wie kann ich eine fließende API debuggen? Schwierig, weil Methodenaufrufe miteinander gekettet werden. Sie können jedoch Konsolen.log -Anweisungen in Ihren Methoden verwenden, um deren Ausgabe zu protokollieren. Darüber hinaus kann die Verwendung eines JavaScript -Debuggers Ihnen helfen, Ihren Code durchzuführen und den Status Ihrer Objekte in jedem Schritt in der Kette zu sehen.
Das obige ist der detaillierte Inhalt vonJavaScript wie ein Boss: Fluent APIs verstehen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!