2010-07-27 133 views
8

我了解JavaScript的字典实现的一些问题和答案,但他们并不满足我的要求:解决方法:JavaScript的解释这需要对象作为键

  • 词典必须能够把对象作为键
  • 值必须是可访问的[] - 运算符

所以我想出了主意,覆盖在Object.prototype中的“的valueOf” - 方法如下:


    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方法在整个代码中没有用于其他目的,你认为有什么缺点吗?

回答

5

这是一个有趣的想法。我建议我的jshashtable。它符合你的第一个要求,但不是第二个要求。我真的没有看到坚持使用方括号属性访问表示法的优点:您有特别的要求吗?

使用jshashtable,可以为构造函数Hashtable提供哈希函数。这个函数传递一个对象作为关键字并且必须返回一个字符串;您可以使用与您所在位置不同的功能,而无需触摸Object.prototype

有一些缺点你的想法:

  1. valueOf方法将在for...in环比任何原生对象显示出来;
  2. 你无法确定哪些键应该被认为是平等的,这是你可能想要做的。相反,所有密钥将被视为唯一。
  3. 这不会与主机对象的工作(环境提供即对象,如DOM元素)
+0

我以前总是使用你的图书馆,它运作良好。但是目前我正在开发一个ActionScript 3 to Javascript转换器。 AS3提供了一个词典。如果我使用你的库,我需要检查类型并用get/set替换括号。如果我使用Object,valueOf不会出现在...中,但是如果我定义了一个新的“class”,它就会出现。 (也许这种行为在其他浏览器中有所不同)。 因为我不喜欢覆盖Object.prototype.valueOf本身,你回答我的问题 – fishbone 2010-07-27 19:14:07

2

这是一个有趣的问题,因为我到目前为止假设任何对象都可以用作索引(但从未尝试过使用关联数组)。我不太了解JavaScript的内部工作原理,但我敢打赌,即使不在您的代码中,valueOf也可以用于其他地方。以后你可能会遇到似乎莫名其妙的问题。至少,我会限制自己到一个新的类,并保留Object;)或者,你明确地调用你的哈希函数,调用它的myHash()或任何和调用z [x.myHash()]增加混乱,但会让我个人觉得睡得更好;)我忍不住想到有更多的JavaScript解决方案,所以考虑所有这些丑陋的解决方法;)

+0

使用另一个“班级”是一个好主意,谢谢;) – fishbone 2010-07-27 16:17:04