当子类被声明时,自动运行一些代码。

3
应该是这样的:
class C {
    static m() { console.log('hi') }
}

// automatically run C.m
class D extends C { }

发现了一个python case。在JavaScript中是否可能实现这个?

我不认为你能做到。但是你为什么想要这样做呢?有什么使用场景吗? - kennarddh
我认为你可以使用自定义的转译器,比如自定义的 Babel 插件。 - kennarddh
2
不可能的,但是无论如何这有什么意义呢?听起来像是一个XY问题。请解释一下你希望通过这个做到什么。 - CherryDT
https://stackoverflow.com/questions/44355812/javascript-execute-function-in-es6-class-on-extend - undefined
重复的问题答案是不同的。 - undefined
1
@kennarddh 答案是错误的,但问题是一样的 - undefined
3个回答

4
JavaScript本身没有元类(metaclass),但你可以通过在函数内定义一个类来创建一个伪元类:
function C() {
    class Cls {
      static m() { console.log('hi') }
    }
    Cls.m()
    return Cls
}

class D extends C() {} // prints 'hi'

看起来很奇怪,而且不干净。 - kennarddh
2
@kennarddh 我同意,但就我所知,那是最接近元类的东西了。 - Lord Elrond
2
@kennarddh 是的,但我不相信有更简洁的方法可行。 - Syed M. Sannan
一个更干净的方法是你需要创建自己的 Babel 转译器,将源代码转译为转译后的代码,并在类定义之后添加 extendedClass.onExtend() - kennarddh
@kennarddh 我已经好几年没写过JavaScript了,所以对babel不太熟悉。这似乎是一个很好的答案。 - Lord Elrond

0
在JS中,当子类被声明时,无法自动运行代码。

0
这个问题可以通过使用自定义的转译器来解决。
我已经制作了一个简单的来解决这个问题。
class Y extends X {}

// This package will always add this after every class that extends other class
X?.onExtend(Y)

你可以在这里看到 Babel 插件的实现 这里

这个包的演示


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接