Heim  >  Artikel  >  Java  >  Zusammenfassung des Aufrufs von js-Methoden in Kotlin

Zusammenfassung des Aufrufs von js-Methoden in Kotlin

零下一度
零下一度Original
2017-06-17 11:57:141996Durchsuche

In diesem Artikel werden hauptsächlich relevante Informationen zur detaillierten Erläuterung des Aufrufs der Methode JavaScript in der Kotlin-Sprache vorgestellt. Freunde in Not können sich auf

beziehen Detaillierte Erläuterung der Instanz des Aufrufs der JavaScript-Methode in der Kotlin-Sprache

Kotlin wurde für die einfache Zusammenarbeit mit der Java-Plattform entwickelt. Es behandelt Java-Klassen als Kotlin-Klassen und Java behandelt Kotlin-Klassen als Java-Klassen. Allerdings ist JavaScript eine dynamisch typisierte Sprache, was bedeutet, dass die Typen zur Kompilierungszeit nicht überprüft werden. Sie können in Kotlin durch dynamische Typisierung frei mit JavaScript kommunizieren. Wenn Sie jedoch die volle Leistungsfähigkeit des Kotlin-Typsystems nutzen möchten, können Sie Kotlin-Header-Dateien für Ihre JavaScript-Bibliotheken erstellen.

Inline-JavaScript

Mit der Funktion js("...") können Sie JavaScript-Code in Kotlin-Code einbetten. Zum Beispiel:


fun jsTypeOf(o: Any): String {
 return js("typeof o")
}

Die Parameter von js müssen String-Konstanten sein. Daher ist der folgende Code falsch:


fun jsTypeOf(o: Any): String {
 return js(getTypeof() + " o") // 此处报错
}
fun getTypeof() = "typeof"

external modifier

teilt Kotlin mit, dass eine bestimmte Deklaration verwendet wird Da es sich um reines JavaScript handelt, sollten Sie es mit dem externen Modifikator markieren. Wenn der Compiler eine solche Deklaration sieht, geht er davon aus, dass die Implementierung der entsprechenden Klasse, Funktion oder Eigenschaft vom Entwickler bereitgestellt wurde, und versucht daher nicht, aus der Deklaration JavaScript-Code zu generieren. Das bedeutet, dass Sie den Hauptteil des externen Deklarationsinhalts weglassen sollten. Zum Beispiel:


external fun alert(message: Any?): Unit

external class Node {
 val firstChild: Node

 fun append(child: Node): Node

 fun removeChild(child: Node): Node

 // 等等
}
external val window: Window

Bitte beachten Sie, dass verschachtelte Deklarationen den externen Modifikator erben, d. h. in der Node-Klasse platzieren wir externe Funktionen und Eigenschaften nicht vor Membern . .

Der externe Modifikator ist nur in Deklarationen auf Paketebene zulässig. Sie können kein externes Mitglied einer nicht externen Klasse deklarieren.

Deklarieren (statischer) Mitglieder einer Klasse

In JavaScript können Sie Mitglieder im Prototyp oder in der Klasse selbst definieren . Das heißt:


function MyClass() {
}
MyClass.sharedMember = function() { /* 实现 */ };
MyClass.prototype.ownMember = function() { /* 实现 */ };

In Kotlin gibt es keine solche Syntax. In Kotlin haben wir jedoch Begleitobjekte. Kotlin behandelt Begleitobjekte der externen Klasse auf besondere Weise: Anstatt ein Objekt zu erwarten, geht es davon aus, dass die Mitglieder des Begleitobjekts Mitglieder der Klasse selbst sind. Um MyClass aus dem obigen Beispiel zu beschreiben, könnten Sie schreiben:


external class MyClass {
 companion object {
  fun sharedMember()
 }

 fun ownMember()
}

Deklarieren Sie optionale Parameter

die externe Funktionen haben können optionale Parameter. Wie die JavaScript-Implementierung die Standardwerte dieser Parameter tatsächlich berechnet, ist Kotlin unbekannt, daher ist es nicht möglich, diese Parameter mit der üblichen Syntax in Kotlin zu deklarieren. Sie sollten die folgende Syntax verwenden:


external fun myFunWithOptionalArgs(x: Int,
 y: String = definedExternally,
 z: Long = definedExternally)

Dies bedeutet, dass Sie myFunWithOptionalArgs mit einem erforderlichen Parameter und zwei optionalen Parametern aufrufen können (ihre Standardwerte werden durch einige JavaScript-Codes bestimmt). Code).

JavaScript-Klassen erweitern

Sie können JavaScript-Klassen problemlos erweitern, da es sich um Kotlin-Klassen handelt. Definieren Sie einfach eine externe Klasse und erweitern Sie sie um nicht externe Klassen. Zum Beispiel:


external open class HTMLElement : Element() {
 /* 成员 */
}

class CustomElement : HTMLElement() {
 fun foo() {
  alert("bar")
 }
}

Es gibt einige Einschränkungen:

Wenn eine Funktion einer externen Basisklasse signiert überladen ist, es kann es in abgeleiteten Klassen nicht überschreiben.

kann eine Funktion, die Standardparameter verwendet, nicht überschreiben.

Bitte beachten Sie, dass Sie eine nicht externe Klasse nicht durch eine externe Klasse erweitern können.

externe Schnittstelle

JavaScript kennt kein Schnittstellenkonzept. Wenn eine Funktion erwartet, dass ihre Argumente die Methoden foo und bar unterstützen, übergeben Sie einfach das Objekt, das tatsächlich über diese Methoden verfügt. Für statisch typisiertes Kotlin können Sie dies beispielsweise mithilfe von Schnittstellen ausdrücken:


external interface HasFooAndBar {
 fun foo()

 fun bar()
}

external fun myFunction(p: HasFooAndBar)

Ein weiterer Anwendungsfall für externe Schnittstellen ist die Beschreibung von Einstellungsobjekten. Zum Beispiel:


external interface JQueryAjaxSettings {
 var async: Boolean

 var cache: Boolean

 var complete: (JQueryXHR, String) -> Unit

 // 等等
}

fun JQueryAjaxSettings(): JQueryAjaxSettings = js("{}")

external class JQuery {
 companion object {
  fun get(settings: JQueryAjaxSettings): JQueryXHR
 }
}

fun sendQuery() {
 JQuery.get(JQueryAjaxSettings().apply {
  complete = { (xhr, data) ->
   window.alert("Request complete")
  }
 })
}

Für externe Schnittstellen gelten einige Einschränkungen:

Sie können nicht auf der rechten Seite eines IS verwendet werden überprüfen.
da die Konvertierung in eine externe Schnittstelle immer erfolgreich ist (und zur Kompilierungszeit eine Warnung erzeugt).
Sie können nicht als verifizierte Typparameter übergeben werden.
Sie können nicht in einem wörtlichen Ausdruck einer Klasse verwendet werden (d. h. I::class).

Das obige ist der detaillierte Inhalt vonZusammenfassung des Aufrufs von js-Methoden in Kotlin. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn