Javascript &引用;这";失去母公司Core的作用域?

Javascript &引用;这";失去母公司Core的作用域?,javascript,Javascript,这在node、js中工作得非常好,但在浏览器中似乎不及格。每当我从Events调用Core.handleLogin时,此从Core.handleLogin中指向一个Socket(Socket.io)。我是否可以让JavaScript将原型的默认this设置为其父级,如node.js CORE.JS /* * CLIENT. * THIS IS THE CORE/PARENT MODULE OF THE GAME. */ (function(){ function Core(clien

这在node、js中工作得非常好,但在浏览器中似乎不及格。每当我从
Events
调用
Core.handleLogin
时,
Core.handleLogin
中指向一个
Socket
(Socket.io)。我是否可以让JavaScript将原型的默认
this
设置为其父级,如node.js

CORE.JS

/*
 *  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;
})();
/*
 *  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;
})();
/*
*客户。
*这是游戏的核心/父模块。
*/
(功能(){
功能核心(客户端){
//游戏模块
this.client=client;
//加载游戏模块
this.Events=newgame.Events(this,client);
this.Map=新游戏.Map(this);
this.Player=新游戏.Player(this);
this.Canvas=newgame.Canvas(this,document.getElementById('Game'));
}
Core.prototype.handleLogin=函数(数据){

console.log(this);您的问题有点让人困惑,因为您说希望
this
成为
Core
,但
Core
是您的构造函数。它不是对象的实例。因此,您可能需要这样的东西:

 var obj = new Core(xxx);
然后,您可以通过以下方式解决事件处理问题:

client.on('loggedIn', obj.handleLogin.bind(obj));
这是因为当你这样做的时候:

client.on('loggedIn', obj.handleLogin); 
您正在获取对
handleLogin
函数的引用,并将其作为事件处理程序传递。当loggedIn事件发生并调用handleLogin时,它将在没有任何对象引用的情况下被调用。当函数、任何函数(甚至定义为方法的函数)在没有任何对象引用的情况下被调用时,则
this
将设置为eit她是全局对象或未定义对象(在严格模式下)。这就是您的情况

这与以下情况相同:

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);
}); 

你的核心对象在哪里?我看到了一个构造函数,但我不认为你想把它作为对象。你可能想在某个地方写
var theCore=new Core();
。然后用以下命令调用它:

  client.on('loggedIn', function () {
     Core.handleLogin.apply(theCore);
  } );
或者简单地说:

 theCore.handleLogin();