Javascript 面向对象的JS-没有全局变量?
我采用面向对象的方法来构建Javascript应用程序。 首先,我要创建一个游戏对象和一个计时器对象 以下是我当前的实现: 计时器对象具有以下方法:Javascript 面向对象的JS-没有全局变量?,javascript,oop,Javascript,Oop,我采用面向对象的方法来构建Javascript应用程序。 首先,我要创建一个游戏对象和一个计时器对象 以下是我当前的实现: 计时器对象具有以下方法: setTimerValue() start() stop() getTimeLeft() timeExpired() Timer.stop() - > emits "timerStoped" Timer.timeExpired() -> emits "timerExpired" 游戏对象具有以下方法: reset()
setTimerValue()
start()
stop()
getTimeLeft()
timeExpired()
Timer.stop() - > emits "timerStoped"
Timer.timeExpired() -> emits "timerExpired"
游戏对象具有以下方法:
reset()
run()
...
Timer.start()
使用window.setInterval()
开始倒计时。
当倒计时为零时,它调用Timer.timeExpired()
Timer.timeExpired()
宣布游戏结束,应调用game.reset()
和game.run()
重新启动游戏。但是,当计时器对象不知道任何关于游戏对象的信息时,如何做到这一点呢
游戏对象是否需要是全局变量才能工作
此外,游戏对象当前有一个计时器对象作为其属性之一。这允许游戏对象调用计时器方法。但不清楚计时器方法如何调用游戏对象
我一直怀疑我在对象之间创建了太多的依赖关系,因此可能需要一些关于如何更好地构建这种依赖关系的建议
谢谢大家。使用事件驱动方法或观察者设计模式。根据我的经验,Javascript具有一种灵活的事件驱动实现。 所以你有一个定时器对象,它实际上不需要知道任何其他对象。 调用Timer.start()时,对象应发出自定义事件,如“timerStarted”,对于其他方法也是如此:
setTimerValue()
start()
stop()
getTimeLeft()
timeExpired()
Timer.stop() - > emits "timerStoped"
Timer.timeExpired() -> emits "timerExpired"
对于计时器引发的每个事件,都应该有一个事件处理程序,当触发响应事件时将调用该事件处理程序
如果使用jquery,则处理事件应该很简单:
var $ = jQuery.noConflict();
var timer = new Timer();
var game = new Game();
$(timer).bind('timerStarted', function(e) {
game.doSomething();
});
在Timer::start()中,您应该编写:
start: function() {
$(this).trigger('timerStarted');
}
另一种方法是使用回调:
如果希望在计时器启动时执行某些操作,可以将lambda函数传递给计时器的启动方法:
// timer method
start: function(callback) {
if(typeof(callback) == 'function') {
callback();
}
}
// main logic
var timer = new Timer();
var game = new Game();
timer.start(function() {
game.doSomething();
});
我希望你能明白这一点,不要相信人们说的“全球都是邪恶的”。他们不是。在某些情况下,使用全局变量显然是可取的。在这种情况下,使用全局变量是很有意义的。我的问题是一个更一般的问题。为了让对象A调用对象B的方法,反之亦然,两者都需要是全局变量吗?当然不需要。但它们确实需要能够获得对另一个对象的引用。两个对象可以相互调用,而其中任何一个都不是全局变量。每个对象只需存储对它希望能够调用方法的任何对象(在其自身实例数据中)的引用。它可以通过创建这样一个对象并保存它的引用(这听起来适合游戏对象中有计时器对象)来实现。或者,可以告诉两个对象彼此的情况,它们可以保存一个引用,以后可以调用。(您的回答说明了我为什么将其作为注释而不是答案。)不,它们只需要彼此有一个引用-可以在它们自己的范围内,在它们的对象内,或者全局,或者如果您愿意,甚至通过其他查找。