【问题标题】:How to use Kotlin to generate a javascript function `constructor`?如何使用 Kotlin 生成 javascript 函数`constructor`?
【发布时间】:2018-04-03 14:37:34
【问题描述】:

我想使用 Kotlin 生成一些 JavaScript,如下所示:

function MyComponent() {
    self.constructor = function() {}
}

问题是constructor是Kotlin中的关键字,我不能这样写:

class MyComponent {
  fun constructor() {}
}

我也试过了:

class MyComponent {
    @JsName("constructor")
    fun ctor() {}
}

它仍然报告如下错误:

JavaScript name generated for this declaration clashes 
with built-in declaration {1}

如何生成一个名为constructor的javascript函数?

【问题讨论】:

  • 我知道这并不能真正解决您的问题,但也许只是尝试将字母“c”更改为大写? ...只是一个建议...
  • @JO3-W3B-D3V constructor 名称是 kotlin 使用的 js lib 必需的,不能更改
  • 我看到了你的问题,我个人从来没有使用过kotlin,我一直想,但是,我从来没有真正使用过它,另一方面,JS......你有吗在你的 JS 中尝试过类似 window["constructor"] 的东西?我不确定这是否可行...
  • @JO3-W3B-D3V 谢谢,这确实是一个值得尝试的方法
  • 没问题,我希望它对你有用。我认为它可能起作用,因为它的编写方式,我可能是错的,谁知道呢。让我知道它是否有效? :)

标签: javascript constructor kotlin keyword


【解决方案1】:

顶级函数应该没有问题。 fun constructor() {} 应该可以正常工作,产生function constructor(){}。至少在 Kotlin 1.2.31 中是这样的。

另一方面,名为 constructor 的成员函数被禁止(例如,您无法在输出 js 文件中获得 A.prototype.constructor = function () {})。一方面会破坏is-check 的实现。

应该可以在类构造函数中修改构造函数属性:

// Kotlin
class A {
  init{
    this.asDynamic().constructor = fun(a: Int) { println(a) }
  }
}

// JS
function A() {
  this.constructor = A_init$lambda;
}
function A_init$lambda(a) {
  println(a);
}

希望有所帮助。

【讨论】:

  • 你说它应该可以工作? - 这不是真正有用的反馈吗?我个人自己不使用 Kotlin,但正如我所说,他不能只做类似window["constructor"] 的事情吗?再说一次,我不知道,我知道 JS、Kotlin,不是很多。
  • @anton 是的,如果fun constructor 是顶级的,你是对的,谢谢!实际上我把我的问题简化得太难了,我真正的问题是类内的constructor。让我修改问题
  • @Freewind 可以修改类构造函数中的属性(添加到答案中)。这就是你想要的吗?
  • @JO3-W3B-D3V 我很有礼貌。不,window["constructor"] 不是解决方案,因为 a) 它解决了不存在的问题,b) 在某些环境(例如 NodeJs)中没有定义窗口
  • @Freewind 顺便问一下,你能告诉我这个库究竟使用构造函数属性做什么吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-12
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 2016-04-08
  • 1970-01-01
相关资源
最近更新 更多