javascript kotlin 中的匿名对象
javascript anonymous object in kotlin
如何在 kotlin 中创建 JavaScript 匿名对象?我想准确地创建这个对象以传递给 nodejs app
var header = {“content-type”:”text/plain” , “content-length” : 50 ...}
可能的解决方案:
1) 具有 js
功能:
val header = js("({'content-type':'text/plain' , 'content-length' : 50 ...})")
注意:括号是强制性的
2) 与 dynamic
:
val d: dynamic = object{}
d["content-type"] = "text/plain"
d["content-length"] = 50
3) 与 js
+ dynamic
:
val d = js("({})")
d["content-type"] = "text/plain"
d["content-length"] = 50
4) 原生声明:
native
class Object {
nativeGetter
fun get(prop: String): dynamic = noImpl
nativeSetter
fun set(prop: String, value: dynamic) {}
}
fun main(args : Array<String>) {
var o = Object()
o["content-type"] = "text/plain"
o["content-length"] = 50
}
另一种可能的解决方案:
object {
val `content-type` = "text/plain"
val `content-length` = 50
}
它似乎不再适用于转义变量名。
我是 Kotlin 新手(虽然不是新手开发人员),我稍微扩展了@bashor 的答案,使一些看起来更整洁的密钥有效 Java 标识符,但仍然允许无效的密钥.我用 Kotlin 1.0.1 测试了它。
@JsName("Object")
open class Object {
}
fun jsobject(init: dynamic.() -> Unit): dynamic {
return Object().apply(init)
}
header = jsobject {
validJavaIdentifier = 0.2
this["content-type"] = "text/plain"
this["content-length"] = 50
}
这是一个使用 lambda 语法初始化对象的辅助函数
inline fun jsObject(init: dynamic.() -> Unit): dynamic {
val o = js("{}")
init(o)
return o
}
用法:
jsObject {
foo = "bar"
baz = 1
}
发出javascript代码
var o = {};
o.foo = 'bar';
o.baz = 1;
这是另一个解决方案:
定义以下辅助函数
fun jsObject(vararg pairs: Pair<Any, Any>): dynamic {
val result = js("({})")
for ((key, value) in pairs) {
result[key] = value
}
return result
}
然后您可以按如下方式使用它
val header = jsObject("content-type" to "text/plain", "content-length" to 50)
可以使用 JavaScript 的 Object.assign()
将常规 Kotlin 对象转换为 JavaScript 匿名对象。这使您可以尽可能长时间地使用纯 Kotlin 和类型安全。所以:
fun Any.toJsObject(): dynamic {
val thisArg = this // Allows use in js() function
return js("Object.assign({},thisArg)")
}
val anObject = object { val a = "a" } // Or use a regular class
console.log( anObject.toJsObject().a ) // logs "a"
在我的 Kotlin/JS + React 项目中,我为一个库编写了一个适配器,它通过构造函数接受匿名配置对象。搜索了一段时间后,我找到了使用 kotlin.js.json
的解决方案
val options = json(
"position" to "top-right",
"durations" to json(
"global" to 20000
)
)
如何在 kotlin 中创建 JavaScript 匿名对象?我想准确地创建这个对象以传递给 nodejs app
var header = {“content-type”:”text/plain” , “content-length” : 50 ...}
可能的解决方案:
1) 具有 js
功能:
val header = js("({'content-type':'text/plain' , 'content-length' : 50 ...})")
注意:括号是强制性的
2) 与 dynamic
:
val d: dynamic = object{}
d["content-type"] = "text/plain"
d["content-length"] = 50
3) 与 js
+ dynamic
:
val d = js("({})")
d["content-type"] = "text/plain"
d["content-length"] = 50
4) 原生声明:
native
class Object {
nativeGetter
fun get(prop: String): dynamic = noImpl
nativeSetter
fun set(prop: String, value: dynamic) {}
}
fun main(args : Array<String>) {
var o = Object()
o["content-type"] = "text/plain"
o["content-length"] = 50
}
另一种可能的解决方案:
object {
val `content-type` = "text/plain"
val `content-length` = 50
}
它似乎不再适用于转义变量名。
我是 Kotlin 新手(虽然不是新手开发人员),我稍微扩展了@bashor 的答案,使一些看起来更整洁的密钥有效 Java 标识符,但仍然允许无效的密钥.我用 Kotlin 1.0.1 测试了它。
@JsName("Object")
open class Object {
}
fun jsobject(init: dynamic.() -> Unit): dynamic {
return Object().apply(init)
}
header = jsobject {
validJavaIdentifier = 0.2
this["content-type"] = "text/plain"
this["content-length"] = 50
}
这是一个使用 lambda 语法初始化对象的辅助函数
inline fun jsObject(init: dynamic.() -> Unit): dynamic {
val o = js("{}")
init(o)
return o
}
用法:
jsObject {
foo = "bar"
baz = 1
}
发出javascript代码
var o = {};
o.foo = 'bar';
o.baz = 1;
这是另一个解决方案:
定义以下辅助函数
fun jsObject(vararg pairs: Pair<Any, Any>): dynamic {
val result = js("({})")
for ((key, value) in pairs) {
result[key] = value
}
return result
}
然后您可以按如下方式使用它
val header = jsObject("content-type" to "text/plain", "content-length" to 50)
可以使用 JavaScript 的 Object.assign()
将常规 Kotlin 对象转换为 JavaScript 匿名对象。这使您可以尽可能长时间地使用纯 Kotlin 和类型安全。所以:
fun Any.toJsObject(): dynamic {
val thisArg = this // Allows use in js() function
return js("Object.assign({},thisArg)")
}
val anObject = object { val a = "a" } // Or use a regular class
console.log( anObject.toJsObject().a ) // logs "a"
在我的 Kotlin/JS + React 项目中,我为一个库编写了一个适配器,它通过构造函数接受匿名配置对象。搜索了一段时间后,我找到了使用 kotlin.js.json
val options = json(
"position" to "top-right",
"durations" to json(
"global" to 20000
)
)