2015-01-02 9 views
5

मैं अपने आप को हैश प्रदान करने के लिए स्ट्रिंग का विस्तार करने की कोशिश कर रहा हूं। मैं Node.js क्रिप्टो लाइब्रेरी का उपयोग कर रहा हूँ।स्ट्रिंग.प्रोटोटाइप के अंदर 'यह' एक ऑब्जेक्ट प्रकार का संदर्भ क्यों देता है, स्ट्रिंग प्रकार नहीं?

मैं इस तरह स्ट्रिंग का विस्तार:

String.prototype.hashCode = function() { 
    return getHash(this); 
}; 

और मैं एक getHash समारोह है कि इस तरह दिखता है:

function getHash(testString) { 
    console.log("type is" + typeof(testString)); 
    var crypto = require('crypto'); 
    var hash = crypto.createHash("sha256"); 
    hash.update(testString); 
    var result = hash.digest('hex'); 
    return result; 
} 

समारोह ठीक काम करता है जब सीधे

var s = "Hello world"; 
console.log(getHash(s)); 
में कहा जाता है, के रूप में

लेकिन जब मैं कोशिश करता हूं:

var s = "ABCDE"; 
console.log(s.hashCode()); 

विधि कॉल विफल रहता है। ऐसा लगता है कि String.prototype.hashCode में किसी ऑब्जेक्ट के रूप में पहचाना जाता है जब crypto.hash.update कहा जाता है, लेकिन एक स्ट्रिंग की अपेक्षा की जाती है। मैंने सोचा कि thisString.prototype के अंदर स्ट्रिंग स्वयं होगा, लेकिन किसी कारण से यह getHash() पर ऑब्जेक्ट की तरह दिखता है। मेरे द्वारा यह कैसे किया जा सकता है?

उत्तर

7

thisstrict mode के बाहर एक आदिम प्रकार के नहीं किया जा सकता, इसलिए यह एक Stringwrapper type है, जो (विशेष रूप से जहाँ तक typeof और समानता के रूप में सभी में एक आदिम स्ट्रिंग की तरह व्यवहार नहीं करता है हो जाता है - दोनों सख्त और ढीली - जाना)। आप इसे डाली कर सकते हैं:

String.prototype.hashCode = function() { 
    return getHash('' + this); 
};

जहां '' + प्रयोग किया जाता है एक आदिम स्ट्रिंग के लिए किसी भी मूल्य कास्ट करने के लिए। (String(this) भी काम करता है, अगर आपको लगता है कि यह स्पष्ट है।)

तुम भी सख्त मोड, जहां चीजें सिर्फ भावना बनाने में जा सकते हैं:

String.prototype.hashCode = function() { 
    'use strict'; 
    return getHash(this); 
}; 
+2

मैं बस 'सख्त उपयोग' के साथ जाऊंगा, लेकिन फिर भी यह बताने के लिए एक टिप्पणी छोड़ दें कि इसकी आवश्यकता क्यों है। यह संभावना है कि अधिकांश रखरखाव कारण नहीं जान पाएंगे। – Marcelo

2

जब आप आदिम के एक चर पर एक विधि कॉल टाइप, तथाकथित ऑटो-मुक्केबाजी जगह ले ली गई है। यह प्रक्रिया संबंधित वस्तु में एक प्राचीन मूल्य को लपेटती है, उदाहरण के लिए 'asdf' से new String('asdf')। चूंकि तकनीकी रूप से आदिम मानों में विधियां और गुण गुण नहीं हैं, वे ऑब्जेक्ट प्रोटोटाइप में होस्ट किए जाते हैं। ऑटो-मुक्केबाजी के साथ आप आदिम मूल्यों पर विधियों को कॉल कर सकते हैं। और एक विधि के भीतर, this हमेशा ऑब्जेक्ट है जिसमें वह विधि है।

यदि आप किसी विधि में आदिम मूल्य का उपयोग करना चाहते हैं, तो आप इसे एक तर्क के रूप में पास कर सकते हैं, या जैसा कि आप चाहें, this से आदिम मान पुनर्प्राप्त कर सकते हैं। उदाहरण के लिए:

var str = new String('asdf') // String {0: "a", 1: "s", 2: "d", 3: "f", length: 4, formatUnicorn: function, truncate: function, splitOnLast: function, [[PrimitiveValue]]: "asdf"} 
String(str) // 'asdf' 

var num = new Number(123) // Number {[[PrimitiveValue]]: 123} 
Number(num) // 123 

var bool = new Boolean(true) // Boolean {[[PrimitiveValue]]: true} 
Boolean(bool) // true 
संबंधित मुद्दे