使我的LiveTime对象成为文字

时间:2014-10-26 04:23:18

标签: javascript oop object-literal

这是我以前的代码,运行良好:

var todayTime = new Date();
(function updateClock() {
    todayTime.setTime(todayTime.valueOf() + 1000);

    // In 2 digit format.
    document.getElementById("hours").innerHTML   = ("0" + todayTime.getHours()).slice(-2);
    document.getElementById("minutes").innerHTML = ("0" + todayTime.getMinutes()).slice(-2);
    document.getElementById("seconds").innerHTML = ("0" + todayTime.getSeconds()).slice(-2);

    setTimeout(updateClock, 1000);
})();

我试图将其更改为对象文字,以便我可以更好地与它进行交互。

我在这里要做的是在start()对象被定义时自动执行LiveTime

还需要跟踪超时ID,以便在我调用stop()方法时可以使用它。

var LiveTime = {
    element: document.getElementById("current-time"),
    date: new Date(),
    timeoutId: 0,

    start: (function() {
        LiveTime.timeoutId = setTimeout(function() {
            LiveTime.date.setTime(LiveTime.date.valueOf() + 1000);

            LiveTime.element.innerHTML = ("0" + LiveTime.date.getHours()).slice(-2) + ":"
                              + ("0" + LiveTime.date.getMinutes()).slice(-2) + ":"
                              + ("0" + LiveTime.date.getSeconds()).slice(-2);
        }, 1000);
    })(),

    stop: function() {
        clearTimeout(LiveTime.timeoutId);
    }
}

不幸的是,代码给了我一堆 undefined 错误。

  

未捕获的TypeError:无法设置未定义的属性'date'

我做错了什么,如何解决这个以及我的代码出错的其他问题?

1 个答案:

答案 0 :(得分:1)

您将start定义为自执行功能。这意味着在创建LiveTime对象时,start将设置为该函数的结果。但由于该功能在LiveTime仍在创建时正在运行,因此LiveTime未定义。将开始定义更改为

start: function() {
    LiveTime.timeoutId = setTimeout(function() {
        LiveTime.date.setTime(LiveTime.date.valueOf() + 1000);

        LiveTime.element.innerHTML = ("0" + LiveTime.date.getHours()).slice(-2) + ":"
                          + ("0" + LiveTime.date.getMinutes()).slice(-2) + ":"
                          + ("0" + LiveTime.date.getSeconds()).slice(-2);
    }, 1000);
},

它应该工作(这仍然是你的代码,没有检查可能存在的任何其他错误)