Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
kotlin中的javascript匿名对象_Kotlin_Kotlin Js - Fatal编程技术网

kotlin中的javascript匿名对象

kotlin中的javascript匿名对象,kotlin,kotlin-js,Kotlin,Kotlin Js,如何在kotlin中创建JavaScript匿名对象?我想创建一个要传递给nodejs应用程序的对象 var header = {“content-type”:”text/plain” , “content-length” : 50 ...} 可能的解决办法: 1) 使用js功能: val header = js("({'content-type':'text/plain' , 'content-length' : 50 ...})") 注:括号为必填项 2) 使用动态: val d: d

如何在kotlin中创建JavaScript匿名对象?我想创建一个要传递给nodejs应用程序的对象

var header = {“content-type”:”text/plain” , “content-length” : 50 ...}
可能的解决办法:

1) 使用
js
功能:

val header = js("({'content-type':'text/plain' , 'content-length' : 50 ...})") 
注:括号为必填项

2) 使用
动态

val d: dynamic = object{}
d["content-type"] = "text/plain"
d["content-length"] = 50
val d = js("({})")
d["content-type"] = "text/plain"
d["content-length"] = 50
3) 使用
js
+
dynamic

val d: dynamic = object{}
d["content-type"] = "text/plain"
d["content-length"] = 50
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
}
本机
类对象{
本土作家
趣味游戏(道具:字符串):dynamic=noImpl
本土作家
乐趣集(prop:String,value:dynamic){}
}
趣味主线(args:Array){
var o=Object()
o[“内容类型”]=“文本/普通”
o[“内容长度”]=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
}

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

感谢快速回复第一个解决方案可能会工作,但它不是灵活的,我的意思是它是硬编码的值,我得到一些错误,以及你可以检查它。第二个解决方案在javascript端创建Kotlin.createObject(…)我无法将其传递给node.js这不起作用,尝试执行与OP相同的操作。这个答案是否过时?@gromit190答案看起来像是实际的,如果您有任何问题,请告诉我。这是“可能的”还是可以工作并执行相同的操作?谢谢@JaysonMinard,我修正了我的答案。这是唯一一个对我有效的答案,救生员!返回类型可以是“动态”到“Json”。e、 内联fun jsObject(init:dynamic.)