“这个”失去了其母公司Core的范围?

时间:2014-10-16 07:12:48

标签: javascript

这在node,js中工作得非常好,但在浏览器中似乎是笨拙的。每当我从Core.handleLogin Eventsthis时,Core.handleLoginSocket点到this(socket.io)。我是否可以让JavaScript将原型的默认/* * CLIENT. * THIS IS THE CORE/PARENT MODULE OF THE GAME. */ (function(){ function Core(client){ //game modules this.client = client; //load game modules this.Events = new Game.Events(this, client); this.Map = new Game.Map(this); this.Player = new Game.Player(this); this.Canvas = new Game.Canvas(this, document.getElementById('game')); } Core.prototype.handleLogin = function(data){ console.log(this); <------------------------------ I WANT THIS TO THE CORE OBJECT if(data){ this.Player.username = data.username; this.Player.rights = data.rights; console.log('Logged in.'); }else{ console.log('Failed login.'); } } Game.Core = Core; })(); 设置为其父级,例如 node.js

CORE.JS

/*
 *  CLIENT
 */

(function(){
function Events(Core,client){
    this.Core = Core;
    this.client = client;

    client.on('connect', function(){
        console.log('Connected to the server.');

        client.emit('login', Core.getCookie('session'));
    });
    client.on('loggedIn', Core.handleLogin); <---------------------------------------
}

Game.Events = Events;
})();

EVENTS.JS

{{1}}

2 个答案:

答案 0 :(得分:1)

您的问题有点令人困惑,因为您说您希望thisCore,但Core是您的构造函数。它不是您对象的实例。所以,你可能需要这样的东西:

 var obj = new Core(xxx);

然后,您可以使用以下内容解决事件处理问题:

client.on('loggedIn', obj.handleLogin.bind(obj));

那是因为当你这样做时:

client.on('loggedIn', obj.handleLogin); 

您将获得handleLogin函数的引用并将其作为事件处理程序传递。当loggedIn事件发生并且它调用handleLogin时,它被调用而没有任何对象引用。当一个函数,甚至一个定义为方法的函数被调用而没有任何对象引用时,this被设置为全局对象或未定义(在严格模式下)。这就是你的情况。

这与以下情况相同:

var f = obj.handleLogin;
f();

执行此操作时,handleLogin将最终被调用而没有对象引用,因此this未设置为obj

因此,要解决这个问题,您必须创建一些其他方法来使用正确的对象引用重新连接函数。实际上有多种方法可以做到这一点,但只要您不需要支持旧的IE,.bind()就是最简单的方法之一。这是另一种方式:

var obj = new Core(xxx);
client.on('loggedIn', function() {
    return obj.handleLogin.apply(Core, arguments);
}); 

答案 1 :(得分:1)

您的Core对象在哪里?我看到一个构造函数,但我不认为你的意思是成为对象。你可能想在某处写var theCore = new Core();。然后用:

调用它
  client.on('loggedIn', function () {
     Core.handleLogin.apply(theCore);
  } );

或简单地说:

 theCore.handleLogin();