В дни ES5 было принято создавать массив ключей и определять их местоположение с помощью линейного поиска.Это не самое эффективное решение, но простое.
function Store() {
this.keys = [];
this.values = [];
}
Store.prototype.set = function(key, val) {
var i = this.keys.indexOf(key);
if(i < 0) {
i = this.keys.push(key) - 1;
}
this.values[i] = val;
};
Store.prototype.get = function(key) {
return this.values[this.keys.indexOf(key)];
};
Store.prototype.has = function(key) {
return this.keys.indexOf(key) >= 0;
};
//
a = document.querySelector("#a")
b = document.querySelector("#b")
c = document.querySelector("#c")
s = new Store()
s.set(a, '1')
s.set(b, '2')
console.log(s.has(a), s.get(a))
console.log(s.has(b), s.get(b))
console.log(s.has(c), s.get(c))
<div id="a"></div>
<div id="b"></div>
<div id="c"></div>
С этим решением связаны две проблемы: во-первых, медленный линейный поиск, во-вторых, и более важно, поскольку Store сохраняет ссылки на ключевые объекты, они не могутсобирать мусор после уничтожения.
Более эффективный вариант - вводить ключ в сами значения, но это гораздо сложнее реализовать.
Для части ES6 есть специальная встроеннаяобъект для такого рода вещей, называется WeakMap
.