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



这个问题涉及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的一个很好的例子?

关于你的第一个问题,不,我认为这样做本身没有任何问题。我会说这是模板方法模式的一种情况(使用属性访问而不是方法,但基本相同(。我确实为您的代码结构增加了一些复杂性,因此,如果可以用更简单的方式解决,我建议使用更简单的解决方案。

关于不初始化构造函数中的成员变量,

理想情况下,构造函数应该使对象处于可用状态,这并不一定意味着初始化每个可能的成员变量。对于该特定的代码片段,在我看来,添加@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是一本学习语言的好书,它有一章是关于OO的,但如果它足够彻底,我就不行了。

是的,这绝对是模板方法模式的情况。对于Coffeescript的一些惯用指南,我会研究 http://coffeescriptcookbook.com/。

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

最新更新