So, I got a function for you: ``` fun KClass<*&...
# javascript
k
So, I got a function for you:
Copy code
fun KClass<*>.defineCustomElement(parent: KClass<out HTMLElement>, tagName: String) {
    fun JsClass<*>.create() = js("Object").create(this)
     
    fun getPropertyNames(obj: dynamic): Array<String> = js("Object").getOwnPropertyNames(obj)
    
    fun getOwnPropertyDescriptor(obj: dynamic, name: String): dynamic = js("Object").getOwnPropertyDescriptor(obj, name)

    fun defineProperty(obj: dynamic, name: String, descriptor: dynamic) = js("Object").defineProperty(obj, name, descriptor)
    
    fun copyProperties(from: dynamic, to: dynamic) {
        for (propertyName in getPropertyNames(from)) {
            val descriptor = getOwnPropertyDescriptor(from, propertyName)
            defineProperty(to, propertyName, descriptor)
        }
    }
    
    val newProto = parent.js.create()
    val oldProto = this.js.asDynamic().prototype
    copyProperties(oldProto, newProto)
    this.js.asDynamic().prototype = newProto
    js("customElements").define(tagName, this.js)
}