उत्पादन कोड के लिए क्लाइंट ब्राउज़रों के साथ एक बड़ी अनुकूलता की आवश्यकता होती है, मैं अभी भी Object.keys
पुराने ब्राउज़रों में सुनिश्चित करने के लिए शिम के साथ इवान नेवस्त्रुव के उत्तर का सुझाव देता हूं । हालांकि, ECMA की नई defineProperty
सुविधा का उपयोग करके मांगी गई सटीक कार्यक्षमता प्राप्त करना संभव है ।
ECMAScript 5 के अनुसार - Object.defineProperty
ECMA5 के रूप में आप Object.defineProperty()
गैर-गुणांक गुणों को परिभाषित करने के लिए उपयोग कर सकते हैं । वर्तमान संगतता अभी भी बहुत कुछ वांछित हो गया है, लेकिन यह अंत में सभी ब्राउज़रों में प्रयोग करने योग्य होना चाहिए। (विशेष रूप से IE8 के साथ वर्तमान असंगति पर ध्यान दें!)
Object.defineProperty(Object.prototype, 'keys', {
value: function keys() {
var keys = [];
for(var i in this) if (this.hasOwnProperty(i)) {
keys.push(i);
}
return keys;
},
enumerable: false
});
var o = {
'a': 1,
'b': 2
}
for (var k in o) {
console.log(k, o[k])
}
console.log(o.keys())
# OUTPUT
# > a 1
# > b 2
# > ["a", "b"]
हालाँकि, चूंकि ECMA5 ने पहले ही Object.keys
आपको जोड़ा है इसलिए आप इसका उपयोग कर सकते हैं:
Object.defineProperty(Object.prototype, 'keys', {
value: function keys() {
return Object.keys(this);
},
enumerable: false
});
मूल उत्तर
Object.prototype.keys = function ()
{
var keys = [];
for(var i in this) if (this.hasOwnProperty(i))
{
keys.push(i);
}
return keys;
}
संपादित करें: चूंकि यह उत्तर थोड़ी देर के लिए रहा है, इसलिए मैं ऊपर से अछूता छोड़ दूंगा। इसे पढ़ने वाले किसी व्यक्ति को इवान नेवोस्त्रुव का जवाब नीचे पढ़ना चाहिए।
प्रोटोटाइप फ़ंक्शंस को गैर-एन्यूमरेबल बनाने का कोई तरीका नहीं है जो उन्हें हमेशा उन लूपों में बदल जाता है जो उपयोग नहीं करते हैं hasOwnProperty
। मुझे अभी भी लगता है कि यह उत्तर आदर्श होगा यदि वस्तु के प्रोटोटाइप का विस्तार करना इतना गड़बड़ नहीं था।