我需要定义一个可以被多个类使用的函数,但据我所知,从超类继承对我来说不起作用。本质上,我想要实现的是为每个类扩展多个接口的能力。
例如,如果我定义了Apple
、Orange
、Banana
类,我希望它们都有一个相同的isFresh()
函数。我还喜欢让Apple
、Orange
和Earth
拥有一个getRadius()
方法。这有点类似于Apple interface Fruit, SphericalObject {...}
我也希望能够覆盖的功能,如果我想。然而,继承对我不起作用,因为我想从多个超类继承。
实现这一目标的最佳途径是什么?
我知道这个similar post,我理解JavaScript是动态类型的,没有接口,建议的Duck Type似乎不能解决我的问题。我并不关心检查接口中的方法是否存在于子类中。
5条答案
按热度按时间kcugc4gi1#
看起来你在找“混合”它们不是内置在JavaScript中的,但在用户环境中很容易实现,例如:
k75qkfdt2#
您只需要一个
extends
就可以实现您的结果。ds97pgxw3#
关于被广泛误解的风险:受Douglas Crockford的启发,我停止使用类或原型(好吧,我在ES中从未使用过的类,never had any use for it)。
创建factory functions。这是一个示范性的水果工厂。
为了实现这个想法,我创建了一个小的Stackblitz project,使用了一种更通用的方法。
u1ehiz5o4#
受@gog的answer的启发,我想分享一个更适合我的修改版本。这个解决方案
1.避免了定义最终不使用的临时类。(例如gog的答案中的空
Apple
类)1.是一种干净的方法来初始化“超类”中的变量(使用gog的原始代码,我无法找到一种干净的方法来定义和继承“超类”中的变量,这使得如果我想在使用这些变量的“子类”中定义函数,它是“不安全的”。
2izufjch5#
从我上面对OP的问题的评论中...
下一个提供的示例完全涵盖了OP的规范...主要基于两个***基于函数的mixin*实现,每个通过基于共享私有状态的方法针对特定的特性/行为,...而提供的
Earth
、Apple
、Orange
和Banana
的单独类实现反映了OP相当不寻常的设计方法,但也确实根据OP的规范应用了每个必要的mixin。