Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Coffeescript/Javascript中自动注册基类_Javascript_Coffeescript - Fatal编程技术网

在Coffeescript/Javascript中自动注册基类

在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

给定一组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.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
如果我的答案解决了您的问题,我可以请您接受答案吗?