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

问题描述:

此问题涉及CoffeeScript,但同样的问题仍然适用于JavaScript。考虑下面这个例子:初始化父类中的变量(JavaScript/CoffeeScript成语)

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的好例子?

关于你的第一个问题,不,我不认为这样做有任何天生的错误。我会说这是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,但如果它足够彻底,我不会。

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

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