这是加入文件的coffeescript类是一种有效的方法吗?

时间:2013-11-23 20:53:36

标签: class coffeescript

我想在Coffescript文件中加入(使用)classe,我在这里发现了一些有用的想法(sry不包括所有链接),因为没有符合我的需求(至少不是我喜欢的)我试图找到一个自己的解决方案,这样可以正常工作,但是有什么我监督的吗?

以下“基础”和“基类”不是OO字,我只是没有找到更好的名字

我有一个基础(类)文件TechDraw

class TechDraw
  constructor: ->
    $(window).load () =>
    ... do somthing

  wave_to_me: ->
    say 'I wave'   # say is a basic func, I always use for debugging (console.log)

@TechDraw = new TechDraw

这很好用

现在我想在其他文件中使用“子类/模块”扩展/扩展我的类;即。我有一个TechDrawLine和一个TechDrawCalc,等等

我做的是为每个人建立一个咖啡文件,如:

class TechDrawConnector
   constructor: (p)->
      @parent=p

    wave: (msg) -> 
      say 'yes its me, the connector:',msg 

`window.TechDrawConnector = function(p) { return new TechDrawConnector(p) };`
# the last instead of a simple new  like
# @TechDrawConnector = new TechDrawConnector 

和我的基础(ic)类/模块我这样扩展:

class TechDraw
  constructor: ->
    $(window).load () =>
       @Connector=window.TechDrawConnector(this) 
       @LineGuy=window.TechDrawLineGuy(this) 


       @Connector.wave('init')

由于我是coffeescript的新手(也是javascript)我的解决方案感觉很简单......

我是否监督过某事?我认为全局命名空间的Polution并不是那么糟糕

1 个答案:

答案 0 :(得分:1)

你不能以这种方式创建一个“扩展”。

如果在同一名称空间中定义同一个类,则第二次将简单地覆盖第一个类并使其可访问。这主要取决于已编译的JavaScript文件的加载顺序。

但是,您可以稍后将一个方法添加到类的原型

#file a.coffee
class A
    constructor: ->
        @foo()

#file B.coffee
A::foo = -> #do something

然而,这不是一种好的风格,并且肯定会在一段时间内非常混乱并导致脆弱的错误。

最好使用一种依赖注入形式

#file a.coffee
class A
    constructor: (@closure) ->
        $(window).load () => @closure()


#file B.coffee
new A () ->
   @Connector=window.TechDrawConnector(@) 
   @LineGuy=window.TechDrawLineGuy(@) 
   @Connector.wave('init')