обходное решение: словарь JavaScript, который берет объекты в качестве ключей

Я считал несколько вопросов и ответов о реализациях словаря 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 метод не используется для других целей в целом коде, Вы думаете, что существуют какие-либо недостатки?

11
задан fishbone 27 July 2010 в 15:56
поделиться

2 ответа

Интересная идея. Предлагаю свою jshashtable . Это соответствует вашему первому требованию, но не второму. Я действительно не вижу преимущества настаивать на использовании обозначения доступа к свойствам квадратных скобок: есть ли у вас какие-то особые требования к этому?

С помощью jshashtable вы можете предоставить хеш-функцию конструктору Hashtable . Этой функции передается объект, который будет использоваться в качестве ключа, и она должна возвращать строку; вы можете использовать функцию, аналогичную той, что у вас есть, не касаясь Object.prototype .

У вашей идеи есть некоторые недостатки:

  1. Ваш метод valueOf будет отображаться в цикле for ... in поверх любого собственного объекта;
  2. У вас есть невозможно определить, какие ключи следует считать равными, что вы можете сделать. Вместо этого все ключи будут считаться уникальными.
  3. Это не будет работать с объектами хоста (т.е. объектами, предоставляемыми средой, такими как элементы DOM)
5
ответ дан 3 December 2019 в 11:02
поделиться

Это интересный вопрос, потому что до сих пор я предполагал, что любой объект может использоваться в качестве индекса (но никогда не пробовал использовать ассоциативные массивы). Я не знаю достаточно о внутренней работе JavaScript, чтобы быть уверенным, но готов поспорить, что valueOf используется где-то еще в JavaScript, даже если не в вашем коде. Позже вы можете столкнуться с, казалось бы, необъяснимыми проблемами. По крайней мере, я бы ограничился новым классом и оставил Object в покое;) Или вы явно вызываете свою хэш-функцию, называя ее myHash () или что-то еще и вызывая z [x.myHash ()], который добавляет беспорядок, но позволяет я лично лучше сплю;) Я не могу удержаться от мысли, что есть решение, которое больше поддерживает JavaScript, поэтому рассмотрите все эти уродливые обходные пути;)

2
ответ дан 3 December 2019 в 11:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: