如何在Coffeescript继承中从父级访问子模型静态

时间:2013-05-13 10:10:02

标签: javascript coffeescript

我有以下BaseModel

namespace 'Models', (exports) ->
  class exports.BaseModel
    toJSON: =>
      if @jsonProperties? then ko.toJSON( @, @jsonProperties() ) else null

然后继承Profile

BaseModel
namespace 'Models', (exports) ->
  class exports.Profile extends exports.BaseModel
    constructor: ( @options ) ->
      @FirstName = ko.observable( @options.FirstName )
      @LastName = ko.observable( @options.LastName )

  @jsonProperties: -> 
    return [ "FirstName", "LastName" ]

这允许我调用类似下面的内容

profile = new Models.Profile
  FirstName: 'blah'
  LastName: 'blah'   

profile.toJSON()

但是在基础模型@jsonProperties中是undefined,因为它有点像类类型上的静态函数。我想要这个的原因是我可以在其他类中引用它,如Models.Profile.jsonProperties()

我可以在BaseModel中访问类似的内容吗?


编辑:添加占位符修复,直到我想出更好的东西

我已经完成了以下工作以使其正常工作,但我宁愿不必在我创建的每个模型中重复这一行,似乎应该有一种通用的方法来从BaseModel执行此操作。

namespace 'Models', (exports) ->
  class exports.Profile extends exports.BaseModel
    constructor: ( @options ) ->
      @jsonProperties = Models.Profile.jsonProperties

1 个答案:

答案 0 :(得分:3)

如果我理解你想要实现的目标,你可以通过将jsonProperties定义为“静态”类方法和实例方法来解决它。这是一个简化的代码(无法访问namespace util和knockout):

class BaseModel
  toJSON: =>
    if @jsonProperties? 
      for value in @jsonProperties()
        @[value]
    else
      null

class Profile extends BaseModel
  constructor: ( @options ) ->
    @FirstName = @options.FirstName
    @LastName = @options.LastName

  @jsonProperties: -> 
    return [ "Class FirstName", "Class LastName" ]

  jsonProperties: -> 
    return [ "FirstName", "LastName" ]

prof = new Profile
  FirstName: 'Leandro'
  LastName: 'Tallmaris'   

alert(prof.toJSON());

alert(Profile.jsonProperties());

第一个提醒应该是Leandro, Tallmaris,而第二个Class FirstName, Class SecondName