【问题标题】:javascript anonymous object in kotlinkotlin 中的 javascript 匿名对象
【发布时间】:2015-01-26 12:27:18
【问题描述】:

如何在 kotlin 中创建 JavaScript 匿名对象?我想准确地创建这个对象以传递给 nodejs 应用程序

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

【问题讨论】:

    标签: kotlin kotlin-js


    【解决方案1】:

    可能的解决方案:

    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
    }
    

    【讨论】:

    • 感谢您的快速回复,第一个解决方案可能有效,但它不灵活,我的意思是它是硬编码值,我也遇到了一些错误,您可以检查一下。第二种解决方案在 javascript 端创建 Kotlin.createObject(.....) 我无法将其传递给 node.js 这不起作用
    • 2017 调用,尝试做与 OP 相同的操作。这个答案过时了吗?
    • @gromit190 答案看起来很真实,如果您有任何问题,请告诉我。
    【解决方案2】:

    这是一个使用 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;
    

    【讨论】:

    • 这是唯一对我有用的救生员!
    • 返回类型可以“动态”到“Json”。例如inline fun jsObject(init: dynamic.() -> Unit): Json {} 这将非常安全。
    【解决方案3】:

    另一种可能的解决方案:

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

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

    【讨论】:

    • 这是“可能的”还是它可以工作并且做同样的事情?
    • 谢谢@JaysonMinard,我修正了答案。
    【解决方案4】:

    在我的 Kotlin/JS + React 项目中,我为一个通过构造函数接受匿名配置对象的库编写了一个适配器。经过一段时间的搜索,我找到了使用kotlin.js.json的解决方案

    val options = json(
        "position" to "top-right",
        "durations" to json(
            "global" to 20000
        )
    )
    

    【讨论】:

      【解决方案5】:

      我是 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
      }
      

      【讨论】:

      • Object() 可以替换为js("{}")
      • 这是相同且更短的fun jsObject(init: dynamic.() -&gt; Unit) = js("{}").apply(init)
      【解决方案6】:

      这是另一个解决方案:
      定义如下辅助函数

      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)
      

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-11-16
          • 1970-01-01
          • 1970-01-01
          • 2012-07-30
          • 1970-01-01
          相关资源
          最近更新 更多