2010-07-27 61 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