此问题并非针对此特定情况。该场景可能涉及任何复杂/深度JavaScript对象,但对于我来说,我可以想象我需要一个场景的问题。不要专门回答提供的示例 - 只有克隆,范围和对象。
如果我在对象中存储了websocket对象,我可以稍后将此websocket移出存储对象并放入另一个对象吗?有点像弹出或拼接一个数组时,数组项目不仅会从数组中删除,而且还会返回给你(没有删除但是转移/'从'中取出')。或者websocket对象是否粘贴/绑定到存储对象{}
? (如果是这样,在较低的范围内,对象 处于什么状态?那么'那么'是什么?)
显然:
//pseudo code
var finalobject = Object.assign({},storageobject.socket);
//not in nodejs? probably a bad idea anyway
var finalobject = storageobject.socket;
//only a shallow reference
delete storageobject.socket
finalobject.test = 'abc123';
// Obvious TypeError: Cannot set property..bla bla
如果可以,我会有什么?:
function lowerscope(x){return x;}
var sameobject=lowerscope(storageobject.socket);
现在是sameobject
羊吗?浅参考或深参考?副本?
如果我先将存储对象中的套接字分配给finalobject
然后删除storageobject.socket
然后我无法使用finalobect
或设置属性,因为这只是我刚删除的内容的浅层参考。
那么如果我通过这样的函数传递finalobject
到底是怎么回事呢? (再次伪代码)
var finalobject = storageobject.socket;
function appInit(mySocket) {
// do app stuff here with mySocket
// set up some functions...
return; // * come back out to main scope
}
appInit(finalobject);
delete storageobject.socket; // * what am I deleting??
对象是否克隆到appInit中?或者它只是作为另一个参考而存在?
这部分(太)特定于我的情况,并且仅在有人要求查看代码或“需要”以了解我为什么要问的时候。
我已将 put / created-reference-to 我新创建的(node.js ws)Websocket放在另一个对象中:
var uid = '7657rrfdt6e6t'; //unique id
var socketsReference = {}; //main scope
socketServer.on('connection',function(mainSocket) {
var socketsGroup = {}; //local scope
mainSocket.uid = uid;
socketsGroup[1] = mainSocket;
socketsReference[uid] = socketsGroup;
socketsGroup[1].send('uid:' + uid);
这是存储在对象中的主套接字。它刚刚将其uid发送给客户端,以便它可以将其设置为其uid属性。
接下来我要做的是将客户端连接到辅助套接字。为此,我希望辅助套接字最终具有与主要类似的uid+'.s2'
唯一ID,因此我所做的是连接第二个套接字然后将新的第二个连接从客户端发送到服务器,该服务器告诉服务器side socket the mainSocket的uid
secondarySocket.on('message', function(data) {
this.uid = data.uid + '.s2';
socketsReference[data.uid][2] = this;
稍后在应用程序中,我会使用正确的用户特定套接字组并将其注入主应用程序,其中连接的用户在他自己的范围内。
var mySockets = socketsReference[my_uid]
appInit(mySockets);