kotlin中的javascript匿名对象

时间:2015-01-26 12:27:18

标签: kotlin kotlin-js

如何在kotlin中创建JavaScript匿名对象?我想创建这个对象以传递给nodejs app

var header = {“content-type”:”text/plain” , “content-length” : 50 ...}

6 个答案:

答案 0 :(得分:14)

可能的解决方案:

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
}

答案 1 :(得分:5)

这是一个使用lambda语法初始化对象的辅助函数

inline fun jsObject(init: dynamic.() -> Unit): dynamic {
    val o = js("{}")
    init(o)
    return o
}

用法:

jsObject {
    foo = "bar"
    baz = 1
}

Emited javascript code

var o = {};
o.foo = 'bar';
o.baz = 1;

答案 2 :(得分:3)

另一种可能的解决方案:

object {
        val `content-type` = "text/plain"
        val `content-length` = 50
}

它似乎不再适用于转义变量名称。

答案 3 :(得分:1)

我是一个Kotlin新手(虽然不是新手开发者),我稍微扩展了@bashor的答案,看起来更贴近那些有效的Java标识符的键,但仍然允许那些不是。我用Kotlin 1.0.1进行了测试。

@native("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
}

答案 4 :(得分:0)

这是另一种解决方案:
定义以下助手功能

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)

答案 5 :(得分:0)

可以使用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"