在Coffeescript/Javascript中自动注册基类
给定一组Coffeescript类,如下所示:在Coffeescript/Javascript中自动注册基类,javascript,coffeescript,Javascript,Coffeescript,给定一组Coffeescript类,如下所示: class A class B extends A class C extends B App = findSub: (obj) -> item for className, item of @ when className isnt 'findSub' and ((item.__super__ is undefined and item is obj) or item.__super__ is obj.prot
class A
class B extends A
class C extends B
App =
findSub: (obj) ->
item for className, item of @ when className isnt 'findSub' and ((item.__super__ is undefined and item is obj) or item.__super__ is obj.prototype or item.__super__ instanceof obj)
class App.A
class App.B extends App.A
class App.C extends App.B
class App.D
console.log App.findSub App.A // [A(), B(), C()]
有没有一种方法可以得到a的子类列表,这样就可以注册它们了
A.types = {}
A.types[class.name] = class for class in subclasses(A)
得到
A = {
"A": A,
"B": B,
"C": C
}
我想到的唯一一件事是手动将每个类添加到A.types
,但我只是好奇是否有一种方法可以将其自动化
我想已经有这样的问题和答案了,但我找不到它。我能想到的唯一办法是在某种名称空间中注册所有这些类,并添加一个在该名称空间中查找子类的方法,类似这样:
class A
class B extends A
class C extends B
App =
findSub: (obj) ->
item for className, item of @ when className isnt 'findSub' and ((item.__super__ is undefined and item is obj) or item.__super__ is obj.prototype or item.__super__ instanceof obj)
class App.A
class App.B extends App.A
class App.C extends App.B
class App.D
console.log App.findSub App.A // [A(), B(), C()]
谢谢。我喜欢这个,我觉得它很聪明。不客气。此外,你的问题是一个很好的例子,为什么我不认为JavaScript是一个面向对象编程语言-你要去建立一个最简单的合同系统的长度是惊人的,这就是为什么我更喜欢用JS功能的方式做越来越多的事情。或者使用一些框架,比如
Ember
。是的,使用Coffeescript感觉就像是在错误上加倍努力。:)不,CoffeeScript允许这种美丽:y=(f)->((g)->(x)->f(g(g))(x))((g)->(x)->f(g(g))(x))
,还有一个关于https://leanpub.com/coffeescript-ristretto/read
如果我的答案解决了您的问题,我可以请您接受答案吗?