2010-07-27 13 views
8

मैं जावास्क्रिप्ट शब्दकोश कार्यान्वयन के बारे में कुछ सवाल और जवाब को पढ़ने के रूप में वस्तुओं लेता है, लेकिन वे मेरी आवश्यकताओं को पूरा नहीं करते हैं:वैकल्पिक हल: जावास्क्रिप्ट शब्दकोश जो कुंजी

  • शब्दकोश कुंजी
  • के रूप में वस्तुओं लेने के लिए सक्षम होना चाहिए
  • मूल्यों से सुलभ होनी चाहिए [] -operator

तो मैं विचार Object.prototype में "valueOf" -method अधिलेखित करने के साथ आया था, इस प्रकार है:


    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 क्रोम के साथ इसका परीक्षण किया और यह अच्छी तरह से काम करता प्रतीत होता है, लेकिन मैं थोड़ा सा संदेह कर रहा हूं, चाहे इससे कुछ कमियां हो जाएंगी, क्योंकि इसे कार्यान्वित करना इतना आसान था।

यह मानते हुए कि पूरे कोड में अन्य उद्देश्यों के लिए valueOf विधि का उपयोग नहीं किया जाता है, क्या आपको लगता है कि कोई नुकसान है?

उत्तर

5

यह एक दिलचस्प विचार है। मैं अपने jshashtable का सुझाव देता हूं। यह आपकी पहली आवश्यकता को पूरा करता है लेकिन दूसरा नहीं। मुझे वास्तव में स्क्वायर ब्रैकेट संपत्ति पहुंच नोटेशन का उपयोग करने पर जोर देने का लाभ नहीं दिख रहा है: क्या आपके पास इसके लिए एक विशेष आवश्यकता है?

jshashtable के साथ, आप Hashtable कन्स्ट्रक्टर को हैशिंग फ़ंक्शन प्रदान कर सकते हैं। यह फ़ंक्शन किसी ऑब्जेक्ट को कुंजी के रूप में उपयोग करने के लिए पास किया जाता है और उसे स्ट्रिंग वापस करनी होगी; आप Object.prototype को छूए बिना, आपके पास जो कुछ भी है, उससे अलग नहीं होने वाले फ़ंक्शन का उपयोग कर सकते हैं।

अपने विचार करने के लिए कुछ नुकसान कर रहे हैं:

  1. आपका valueOf विधि किसी भी देशी वस्तु पर एक for...in पाश में ही दिखाई देगा;
  2. आपके पास यह निर्धारित करने का कोई तरीका नहीं है कि किन कुंजियों को बराबर माना जाना चाहिए, जो कुछ आप करना चाहते हैं। इसके बजाए, सभी चाबियाँ अद्वितीय मानी जाएंगी।
  3. यह मेजबान वस्तुओं के साथ काम नहीं करेंगे (यानी वस्तुओं वातावरण द्वारा प्रदान की, इस तरह के डोम तत्व के रूप में)
+0

मैंने हमेशा आपकी लाइब्रेरी का उपयोग पहले किया था और यह अच्छी तरह से काम करता है। लेकिन वर्तमान में मैं जावास्क्रिप्ट कनवर्टर के लिए एक्शनस्क्रिप्ट 3 पर काम कर रहा हूं। एएस 3 एक शब्दकोश प्रदान करता है। अगर मैं आपकी लाइब्रेरी का उपयोग करता हूं, तो मुझे प्रकारों को जांचने और सेट/सेट के साथ ब्रैकेट को प्रतिस्थापित करने की आवश्यकता होगी। ValueOf में प्रकट नहीं होता है ... यदि मैं ऑब्जेक्ट का उपयोग करता हूं, लेकिन ऐसा लगता है कि अगर मैं एक नया "वर्ग" परिभाषित करता हूं। (शायद यह अन्य ब्राउज़रों में अलग-अलग व्यवहार करता है)। चूंकि मैं ऑब्जेक्ट.प्रोटोटाइप.वल्यू को ओवरराइट करना पसंद नहीं करता हूं, स्वयं ही आपने मेरे प्रश्न का उत्तर दिया – fishbone

2

यह एक दिलचस्प सवाल है, क्योंकि मैंने अब तक माना है कि किसी ऑब्जेक्ट को इंडेक्स के रूप में उपयोग किया जा सकता है (लेकिन कभी भी सहयोगी सरणी के साथ प्रयास नहीं किया जाता है)। मैं निश्चित रूप से जावास्क्रिप्ट के आंतरिक कार्यों के बारे में पर्याप्त नहीं जानता, लेकिन मैं उस मान को शर्त लगाता हूं अगर कहीं भी जावास्क्रिप्ट द्वारा उपयोग किया जाता है, भले ही आपके कोड में न हो। आप बाद में प्रतीत होता है कि अकल्पनीय समस्याओं में भाग ले सकते हैं। कम से कम, मैं खुद को एक नई कक्षा में सीमित कर दूंगा और ऑब्जेक्ट को अकेला छोड़ दूंगा;) या, आप स्पष्ट रूप से अपने हैशिंग फ़ंक्शन को कॉल करते हैं, इसे myHash() या जो कुछ भी कहते हैं और z [x.myHash()] को कॉल करते हैं जो अव्यवस्था को जोड़ता है लेकिन चलेगा मैं, व्यक्तिगत रूप से, बेहतर नींद;) मैं यह सोचने का विरोध नहीं कर सकता कि इसके लिए एक और जावास्क्रिप्ट-जागरूक समाधान है, इसलिए इन सभी बदसूरत कामकाजों पर विचार करें;)

+0

एक और "कक्षा" का उपयोग करना एक अच्छा विचार है, धन्यवाद;) – fishbone

0

यदि आप इस सवाल का एक जे एस शब्दकोश जहां वस्तुओं चाबियाँ हैं की तलाश में आया था पर मानचित्र Map vs Object in JavaScript

को देखो
संबंधित मुद्दे