Я считал несколько вопросов и ответов о реализациях словаря JavaScript, но они не отвечают моим требованиям:
Таким образом, я придумал идею перезаписать "valueOf" - метод в Object.prototype, следующим образом:
Object.__id__ = 0;
Object.prototype.valueOf = function() {
if(!this.__id__)
this.__id__ = ++Object.__id__;
return "__id__" + this.__id__;
}
Object.prototype.toString = Object.prototype.valueOf;
//test
var x = {p1: "5"};
var y = [6];
var z = {};
z[x] = "7";
z[y] = "8";
console.log(z[x], z[y]);
Я протестировал это с Google Chrome, и это, кажется, работает хорошо, но я немного скептически настроен, вызовет ли это некоторые недостатки, так как было настолько легко реализовать.
При полагании, что valueOf метод не используется для других целей в целом коде, Вы думаете, что существуют какие-либо недостатки?
Интересная идея. Предлагаю свою jshashtable . Это соответствует вашему первому требованию, но не второму. Я действительно не вижу преимущества настаивать на использовании обозначения доступа к свойствам квадратных скобок: есть ли у вас какие-то особые требования к этому?
С помощью jshashtable вы можете предоставить хеш-функцию конструктору Hashtable
. Этой функции передается объект, который будет использоваться в качестве ключа, и она должна возвращать строку; вы можете использовать функцию, аналогичную той, что у вас есть, не касаясь Object.prototype
.
У вашей идеи есть некоторые недостатки:
valueOf
будет отображаться в цикле for ... in
поверх любого собственного объекта; Это интересный вопрос, потому что до сих пор я предполагал, что любой объект может использоваться в качестве индекса (но никогда не пробовал использовать ассоциативные массивы). Я не знаю достаточно о внутренней работе JavaScript, чтобы быть уверенным, но готов поспорить, что valueOf используется где-то еще в JavaScript, даже если не в вашем коде. Позже вы можете столкнуться с, казалось бы, необъяснимыми проблемами. По крайней мере, я бы ограничился новым классом и оставил Object в покое;) Или вы явно вызываете свою хэш-функцию, называя ее myHash () или что-то еще и вызывая z [x.myHash ()], который добавляет беспорядок, но позволяет я лично лучше сплю;) Я не могу удержаться от мысли, что есть решение, которое больше поддерживает JavaScript, поэтому рассмотрите все эти уродливые обходные пути;)