替换对象属性时出现意外行为

时间:2013-10-07 08:48:39

标签: javascript coffeescript

我正在使用mocha对新编写的类运行测试,需要构建一些Event来进行比较。我计划使用对象存根,并将它们替换为Event类的实际实例,由于数据库连接的使用,它们具有异步构造函数。所以我正在使用递归调用来按顺序处理存根。 这是问题:我的所有存根对象都替换为最新的实例,我不明白为什么。请解释我错在哪里。

Event.coffee:

class Event
    start = 0
    duration = 0
    title = ""
    atype = {}

    constructor: (_start, _duration, _title, _atype, cb) ->
        start = _start
        duration = _duration
        title = _title

        evt = @
        ActivityType.find( {} =
            where: {} =
                title: _atype
        ).success( (res) ->
            atype = res

            cb? evt
        ).error( () ->
            throw new Error "unable to assign atype '#{_atype}'"
        )
# ...

Event.test.coffee:

# ...
suite "getEventAt", () ->
    events =
        FREE: {} =
            start: 0
            duration: Day.MINUTES_PER_DAY
            title: "Free time"
            type: "FREE"
        REST: {} =
            start: 10
            duration: 30
            title: "rest"
            type: "_REST"
        FITNESS: {} =
            start: 30
            duration: 30
            title: "fitness"
            type: "_FITNESS"
        WORK: {} =
            start: 20
            duration: 30
            title: "work"
            type: "_WORK"

    suiteSetup (done) ->
        buildEvent = (ki) ->
            ks = Object.keys events
            ( (k) ->
                v = events[k]
                new Event v.start, v.duration, v.title, v.type, (e) ->
                    events[k] = e
                    if k == ks[ks.length-1]
                        return done?()
                    return buildEvent(ki+1)
            )(ks[ki])
        buildEvent(0)
# ...

1 个答案:

答案 0 :(得分:2)

开始持续时间标题和atype是类变量,因此每次创建新事件时都会被覆盖

class Event

    constructor: (_start, _duration, _title, _atype, cb) ->
        @start = _start
        @duration = _duration
        @title = _title

        evt = @
        ActivityType.find( {} =
            where: {} =
                title: _atype
        ).success( (res) =>
            @atype = res

            cb? evt
        ).error( () ->
            throw new Error "unable to assign atype '#{_atype}'"
        )

请注意成功回调的平箭(有关详细信息,请参阅:http://coffeescript.org/#fat-arrow