You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确扩展Kotlin/JS的JS包装类 解决Path2D子类构造报错问题

问题根源

Kotlin/JS对直接继承Path2D这类浏览器原生external JS类的支持存在限制,自动生成的JS代码调用父类构造函数的逻辑不符合原生API要求,因此抛出「Path2D constructor: 'new' is required」错误。

正确实现方案

方案1:组合实现(最稳定,无兼容问题)

无需强行继承Path2D,在自定义类内部持有原生Path2D实例,代理需要用到的原生方法后再添加自定义逻辑即可:

class ExtraPath {
    // 内部持有原生Path2D实例
    private val nativePath = Path2D()

    // 代理需要用到的Path2D原生方法
    fun rect(x: Double, y: Double, width: Double, height: Double) = nativePath.rect(x, y, width, height)
    // 其他需要的Path2D方法都可按相同规则代理

    // 自定义扩展方法
    fun extraFunction() {
        // 自定义逻辑
    }

    // 需要传入原生API时调用该方法获取原生实例
    fun getNativePath() = nativePath
}

调用示例:

fun main() {
    val canvas=document.getElementById("mainCanvas") as HTMLCanvasElement
    val ctx=canvas.getContext("2d") as CanvasRenderingContext2D
    val path=ExtraPath()
    path.rect(10.0,10.0,10.0,10.0)
    ctx.stroke(path.getNativePath())
    path.extraFunction()
}

方案2:实现Path2D接口(适配原生API入参要求)

如果你的自定义类必须直接作为Path2D类型传入原生API,可以用Kotlin类委托特性实现Path2D接口,所有原生方法自动代理给内部的原生实例:

class ExtraPath private constructor(private val native: Path2D) : Path2D by native {
    constructor() : this(js("new Path2D()") as Path2D)

    fun extraFunction() {
        // 自定义逻辑
    }
}

调用时可直接作为Path2D实例使用:

fun main() {
    val canvas=document.getElementById("mainCanvas") as HTMLCanvasElement
    val ctx=canvas.getContext("2d") as CanvasRenderingContext2D
    val path=ExtraPath()
    path.rect(10.0,10.0,10.0,10.0)
    ctx.stroke(path) // 直接传入即可正常运行
    path.extraFunction()
}

内容的提问来源于stack exchange,提问作者D. Kupra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 02:24:04