Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 面向对象的JS-没有全局变量?_Javascript_Oop - Fatal编程技术网

Javascript 面向对象的JS-没有全局变量?

Javascript 面向对象的JS-没有全局变量?,javascript,oop,Javascript,Oop,我采用面向对象的方法来构建Javascript应用程序。 首先,我要创建一个游戏对象和一个计时器对象 以下是我当前的实现: 计时器对象具有以下方法: setTimerValue() start() stop() getTimeLeft() timeExpired() Timer.stop() - > emits "timerStoped" Timer.timeExpired() -> emits "timerExpired" 游戏对象具有以下方法: reset()

我采用面向对象的方法来构建Javascript应用程序。 首先,我要创建一个游戏对象和一个计时器对象

以下是我当前的实现: 计时器对象具有以下方法:

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的方法,反之亦然,两者都需要是全局变量吗?当然不需要。但它们确实需要能够获得对另一个对象的引用。两个对象可以相互调用,而其中任何一个都不是全局变量。每个对象只需存储对它希望能够调用方法的任何对象(在其自身实例数据中)的引用。它可以通过创建这样一个对象并保存它的引用(这听起来适合游戏对象中有计时器对象)来实现。或者,可以告诉两个对象彼此的情况,它们可以保存一个引用,以后可以调用。(您的回答说明了我为什么将其作为注释而不是答案。)不,它们只需要彼此有一个引用-可以在它们自己的范围内,在它们的对象内,或者全局,或者如果您愿意,甚至通过其他查找。