在父类中初始化变量(JavaScript / CoffeeScript习语)

时间:2012-08-03 17:30:51

标签: javascript class coding-style coffeescript idioms

这个问题涉及CoffeeScript,但同样的问题仍然适用于JavaScript。考虑这个例子:

class Parent    
    func: ->
        alert @member

class Child extends Parent    
    constructor: ->
        @greet()

    greet: ->
        @member = 'hello!'
        @func()

Parent本身没用。 (new Parent).func()返回undefined

我的问题是:

  • 定义像Parent这样只为子类提供常用函数和属性的类有什么问题吗? Parent可以是其自己文件中的复杂类,为原型链中的类提供功能。如果没有文档,这可能会令人困惑。

  • Child.greet中,我们动态地将member添加到Child对象。在没有首先在构造函数中初始化对象的情况下向对象添加新成员有什么问题吗?做constructor: -> @member = null; @greet()会更好吗?这样,下一个程序员就会知道对象将拥有哪些成员,并避免使用未定义的变量。另一方面,代码会产生更多噪音,而JavaScript并不需要这样做。

  • 最后,是否有一个源代码,它是CoffeeScript中惯用OOP的一个很好的例子?

2 个答案:

答案 0 :(得分:2)

关于你的第一个问题,不,我认为这样做没有任何内在错误。我会说这是template method pattern的情况(使用属性访问而不是方法,但基本相同)。我确实为你的代码结构增加了一些复杂性,因此,如果能够以更简单的方式解决它,我建议你选择更简单的解决方案。

关于不在构造函数中初始化成员变量,理想情况下,构造函数应该使对象处于可用状态,这并不一定意味着初始化每个可能的成员变量。对于该特定代码段,添加@member = null在我看来不会增加任何内容。一个坏构造函数的例子就是要求用户在使用它之前做更多的事情而不是实例化对象,例如:

c = new Circle
c.radius = 5 # Need to set the radius to get the area.
console.log c.area() # If i hadn't set the radius this would break.

我不知道惯用OO CoffeeScript的良好来源。我认为Smooth CoffeeScript是一本学习该语言的好书,它有一个chapter about OO,但如果它足够彻底,我就不会这样做。

答案 1 :(得分:1)

是的,这绝对是模板方法模式的一个例子。 对于Coffeescript的一些惯用指南,我会调查http://coffeescriptcookbook.com/

但任何关于惯用Ruby的Ruby书籍/参考书肯定都会有所帮助。