将属性分配给对象时,该属性的键是字符串。如果您将诸如套接字之类的东西作为键传递,那么 javascript 将努力将其转换为字符串并将其存储为键。如果 WebSocket 对转换为字符串的方法没有特殊支持toString()
,那么您将获得一些通用转换,例如[object Object]
这意味着您的所有 WebSocket 将显示为相同的属性。
.hasOwnProperty()
当您查找密钥时也是如此。所以,你基本上会做:
theObject.hasOwnProperty("[object Object]")
对于您所有的插座,因此它们看起来都一样。
您可以通过为您的套接字提供某种唯一 ID 然后将其用作键来解决此问题,您可以将套接字本身作为数据放在地图对象中。
例如,您可以这样做:
function addSocketToMap(socket, obj) {
if (!socket.uniqueKey) {
socket.uniqueKey = addSocketToMap.cntr++;
}
obj[socket.uniqueKey] = socket;
}
addSocketToMap.cntr = 0;
function isSocketInMap(socket, obj) {
if (socket.uniqueKey) {
return obj.hasOwnProperty(socket.uniqueKey);
}
return false;
}
var theObject = {};
addSocketToMap(socketA, theObject);
addSocketToMap(socketB, theObject);
var a = isSocketInMap(socketA, theObject); // true
var b = isSocketInMap(socketB, theObject); // true
如果这不会导致其实现出现任何问题,您也可以只覆盖 WebSocket 对象的 toString :
(function() {
var cntr = 0;
WebSocket.prototype.toString = function () {
// add a uniqueKey if it doesn't already exist
if (!this.uniqueKey) {
this.uniqueKey = cntr++;
}
// make a unique string identifier
// that will look like "WebSocket_xxx"
return "WebSocket_" + this.uniqueKey;
}
})();