2010-07-27 7 views
8

he leído un par de preguntas y respuestas acerca de las implementaciones de Javascript de diccionario, pero no cumple con mis requisitos:solución: javascript diccionario que lleva objetos como llaves

  • el diccionario debe ser capaz de tomar los objetos como llaves
  • los valores deben ser accesibles por el [] -operator

Así que se me ocurrió la idea para sobrescribir el -method "valueOf" en Object.prototype, de la siguiente manera:


    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]); 

Probé esto con google-chrome y parece funcionar bien, pero soy un poco escéptico, si esto causará algunos inconvenientes, ya que fue muy fácil de implementar.

Considerando que el método valueOf no se usa para otros fines en todo el código, ¿cree que existen desventajas?

Respuesta

5

Es una idea interesante. Sugiero mi jshashtable. Cumple con su primer requisito, pero no el segundo. Realmente no veo la ventaja de insistir en usar la notación de acceso a la propiedad de los corchetes: ¿tiene un requisito particular para ello?

Con jshashtable, puede proporcionar una función hash al constructor Hashtable. Esta función se pasa a un objeto que se utilizará como clave y debe devolver una cadena; podría usar una función no muy diferente a la que tiene allí, sin tener que tocar Object.prototype.

hay algunas desventajas a su idea:

  1. Su valueOf método se mostrará en un bucle for...in sobre cualquier objeto nativo;
  2. No tiene manera de determinar qué claves se deben considerar iguales, lo cual es algo que quizás quiera hacer. En cambio, todas las claves se considerarán únicas.
  3. Esto no va a trabajar con objetos host (es decir, objetos proporcionados por el medio ambiente, tales como elementos DOM)
+0

Siempre he usado su biblioteca antes y funciona bien. Pero actualmente estoy trabajando en un convertidor de ActionScript 3 a Javascript. AS3 proporciona un diccionario. Si utilizo su biblioteca, necesitaría verificar los tipos y reemplazar los paréntesis con get/set. El valueOf no aparece en ... en si uso Object, pero aparece si defino una nueva "clase". (Tal vez este comportamiento sea diferente en otros navegadores). Como no me gusta sobrescribir Object.prototype.valueOf, respondió mi pregunta – fishbone

2

Es una pregunta interesante, porque hasta ahora he supuesto que cualquier objeto se puede usar como índice (pero nunca se ha intentado con matrices asociativas). No sé lo suficiente sobre el funcionamiento interno de JavaScript para estar seguro, pero apostaría a que valueOf se usa en algún lugar más JavaScript, incluso si no está en su código. Es posible que se encuentre con problemas aparentemente inexplicables más adelante. Al menos, me limitaría a una nueva clase y dejaría Object solo;) O bien, llamará explícitamente a su función de hash, llamándola myHash() o lo que sea, y llamando a z [x.myHash()], lo que agrega desorden pero deja que yo, personalmente, duermo mejor;) No puedo evitar pensar que hay una solución más consciente de esto, así que considere todas estas feas soluciones;)

+0

Usar otra "clase" es una buena idea, gracias;) – fishbone

Cuestiones relacionadas