2015-02-06 5 views
4

Итак, я довольно новичок в JavaScript, и, хотя я знаю небольшие трюки, чтобы делать подобные вещи на Java, такие же трюки здесь не применяются, или, по крайней мере, я не могу понять как использовать их, так что я в настоящее время используют два объекта в виде коллекций:Объект JavaScript, ссылающийся на

var ConnectedClients_socket = {}; 
var ConnectedClients_networkId = {}; 

трюме пару ключ/значение, чтобы связать networkID к клиенту, а затем дублированный объект, который использует сокет ключ. Любая оптимизация будет отличной, я буду хватать клиента сокетами и идентификаторами во всем приложении.

О проблеме:

После отключения нужно удалить экземпляр клиента из ConnectedClients_networkId объекта. По моему мнению, это делается с использованием ключевого слова delete.

Вот код, я в настоящее время пытается использовать для этого:

console.log('socket disconnected'); 
delete Client.ConnectedClients_networkId[Client.ConnectedClients_socket[socket].getNetworkId()]; 
delete Client.ConnectedClients_socket.socket; 

Однако это дает мне следующую ошибку:

TypeError: Cannot call method 'getNetworkId' of undefined 

, который показывает, что

Client.ConnectedClients_socket[socket] 

Возвращает undefined, а Client.ConnectedClients_socket.socket успешно удаляется. Я просмотрел несколько разных страниц о получении значения из ключа в JavaScript, и я не вижу, что я делаю неправильно.

Вот конструктор для клиента:

var Client = function(networkId, socket, ...) { 
    this.networkId = networkId; 
    this.socket = socket; 
    ... 
    ConnectedClients_socket.socket = this; 
    ConnectedClients_networkId.networkId = this; 
} 
+0

Хорошая работа, описывающая вашу проблему; +1. – Scimonster

+0

Действительно, очень чистое описание. +1 –

+0

Не является линией Client.ConnectedClients_socket [socket] .getNetworkId() должно быть Client.ConnectedClients_socket.socket.getNetworkId()? – Deshan

ответ

1

Вы должны использовать точечную нотацию там.

delete Client.ConnectedClients_networkId[Client.ConnectedClients_socket.socket.getNetworkId()]; 

Кнопочная нотация будет анализировать его как JavaScript, поэтому он полезен для динамического получения недвижимости.

+1

Я не совсем уверен, что понимаю, как это работает. Я читал во многих областях, что скобки и точечные обозначения были полностью взаимозаменяемыми. Не могли бы вы связать меня где-нибудь, что это объясняется подробно? – Hobbyist

+1

http: // stackoverflow.com/questions/1168807/how-can-i-add-a-key-value-pair-to-a-javascript-object-literal/1168814 # 1168814 – Scimonster

+0

@ Christian.tucker Кнопочная нотация принимает только строку. – Lewis

2

Котировки?

Client.ConnectedClients_socket['socket'] 

Однако здесь нет необходимости в этих обозначениях.

Client.ConnectedClients_socket.socket 

Прекрасно.

Обозначение скобок может использоваться для доступа к элементам со специальными символами или по переменной величине.

Client.ConnectedClients_socket['someArr[]'] 

или

var x = 'socket'; 
Client.ConnectedClients_socket[x] 
Смежные вопросы