ホームページ >Java >&#&チュートリアル >Kotlin での js メソッド呼び出しの概要

Kotlin での js メソッド呼び出しの概要

零下一度
零下一度オリジナル
2017-06-17 11:57:142020ブラウズ

この記事では、Kotlin 言語での JavaScript の呼び出しの詳細な説明に関する関連情報を主に紹介します。必要な方は、

の呼び出しの詳細な説明を参照してください。 Kotlin 言語の JavaScript メソッド

Kotlin は、Java プラットフォームと簡単に相互運用できるように設計されています。 Java クラスは Kotlin クラスとして扱われ、Java は Kotlin クラスを Java クラスとして扱います。ただし、JavaScript は動的に型指定される言語であるため、コンパイル時に型をチェックしません。 Kotlin では動的型付けを通じて JavaScript と自由に通信できますが、Kotlin 型システムの能力を最大限に活用したい場合は、JavaScript ライブラリ用の Kotlin ヘッダー ファイルを作成できます。

インライン JavaScript

js("...") 関数を使用して、JavaScript コードを Kotlin コードに埋め込むことができます。 例:


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

js のパラメータは string定数である必要があります。したがって、次のコードは正しくありません:


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

external 修飾子

特定の宣言が純粋な JavaScript で記述されていることを Kotlin に伝えるには、その宣言を external 修飾子でマークする必要があります。 コンパイラはそのような宣言を認識すると、対応するクラス、関数、またはプロパティの実装が開発者によって提供されたものと想定し、そのため宣言から JavaScript コードを生成しようとしません。 これは、外部宣言コンテンツの本文を省略する必要があることを意味します。例:


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

ネストされた宣言は外部修飾子を継承することに注意してください。つまり、Node クラスでは、メンバー関数やプロパティの前に external を配置しません。

外部修飾子はパッケージレベルの宣言でのみ許可されます。 非外部クラスの外部メンバーを宣言することはできません。

クラスの (static) メンバーの宣言

JavaScript では、プロトタイプまたはクラス自体にメンバーを定義できます。つまり:


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

Kotlin にはそのような構文はありません。ただし、Kotlin にはコンパニオン オブジェクトがあります。 Kotlin は、外部クラスのコンパニオン オブジェクトを特別な方法で扱います。オブジェクトを期待するのではなく、コンパニオン オブジェクトのメンバーがクラス自体のメンバーであると想定します。上記の例から MyClass を説明するには、次のように記述できます:


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

 fun ownMember()
}

オプションのパラメーターの宣言

外部関数はオプションのパラメーターを持つことができます。 JavaScript 実装が実際にこれらのパラメーターのデフォルト値をどのように計算するかは Kotlin には不明であるため、Kotlin の通常の構文を使用してこれらのパラメーターを宣言することはできません。 次の構文を使用する必要があります:


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

これは、1 つの必須引数と 2 つのオプション引数 (それらのデフォルト値は一部の JavaScript コードによって計算されます) を使用して myFunWithOptionalArgs を呼び出すことができることを意味します。

JavaScript クラスの拡張

JavaScript クラスは Kotlin クラスであるため、簡単に拡張できます。外部クラスを定義し、それを非外部クラスで拡張するだけです。例:


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

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

いくつかの制限があります:

外部基本クラスの関数が署名されている場合オーバーロード、派生クラスでオーバーライドすることはできません。

デフォルトのパラメーターを使用する関数をオーバーライドすることはできません。

非外部クラスを外部クラスで拡張することはできないことに注意してください。

外部インターフェース

JavaScript にはインターフェースの概念がありません。関数がその引数で foo メソッドと bar メソッドをサポートすることを期待している場合は、実際にそれらのメソッドを持つオブジェクトを渡すだけです。 静的に型付けされた Kotlin の場合、インターフェイスを使用してこれを表現できます。例:


external interface HasFooAndBar {
 fun foo()

 fun bar()
}

external fun myFunction(p: HasFooAndBar)

外部インターフェイスの別の使用例は、設定オブジェクトを記述することです。例:


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

外部インターフェースにはいくつかの制限があります:

is チェックの右側では使用できません。
外部インターフェイスへの変換は常に成功するため (コンパイル時に警告が生成されます)。
具体化された型パラメータとして渡すことはできません。
クラス (つまり、I::class) のリテラルの では使用できません。

以上がKotlin での js メソッド呼び出しの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。