gpt4 book ai didi

javascript - 如何在 Kotlin for Javascript 中为类设置静态属性

转载 作者:行者123 更新时间:2023-12-01 03:24:04 26 4
gpt4 key购买 nike

我遇到一种情况,我需要在 Kotlin 中的类上定义静态属性,当它编译为 Javascript 时,它会成为该类上真正的静态字段。在这种情况下,伴随对象不起作用。

例如,如果我有一个抽象类及其实现类,如下所示:

abstract class MyAbstractClass{
abstract val id: Int
}

class MyClass: MyAbstractClass(){
override val id: Int = 1 //I want this to actually be "static" on the MyClass
}

编译后的 Javascript 是这样的:

function MyAbstractClass() {
}

function MyClass() {
MyAbstractClass.call(this);
this.id_jz5fma$_0 = 1;
}

Object.defineProperty(MyClass.prototype, 'id', {
get: function () {
return this.id_jz5fma$_0;
}
});

但是我需要它编译成这样:

function MyAbstractClass() {
}

function MyClass() {
MyAbstractClass.call(this);
}

MyClass.id = 1;

这样 id 字段实际上静态存在于 MyClass 上,而无需创建 MyClass 的新实例。

我尝试过使用伴生对象,但它创建了一个名为 MyClass$Companion 的单独对象/函数,然后将 id 字段分配给它,但从未实际分配它静态地到 MyClass

如何在 Kotlin 中设置这样的真正静态字段?

最佳答案

目前我们没有直接的方法来做到这一点,所以我创建了问题 https://youtrack.jetbrains.com/issue/KT-18891

作为解决方法,您可以编写这样的函数:

inline fun <reified T : Any> addStaticMembersTo(source: Any) {
val c = T::class.js.asDynamic()
val ownNames = js("Object").getOwnPropertyNames(source) as Array<String>
val protoNames = js("Object").getOwnPropertyNames(source.asDynamic().constructor.prototype) as Array<String>

for (name in ownNames + protoNames) {
c[name] = source.asDynamic()[name]
}
}

并使用类似:

class A {
companion object {
init {
addStaticMembersTo<A>(object {
val bar = 1
fun foo() {}
})
}
}
}

甚至使伴生对象的成员可用作类的静态成员:

class B {
companion object {
val bar = 1
fun foo() {}

// should be at the end of companion object
init {
addStaticMembersTo<B>(this)
}
}
}

完整示例请参见此处: https://try.kotl.in/#/UserProjects/uube1qikg3vsegtnefo0ad0jag/30f1qf87dt5k5vjhciirt4t108

关于javascript - 如何在 Kotlin for Javascript 中为类设置静态属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44955888/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com