2012-07-03 9 views
9

वहाँ कह रही है कि जब भी for..in पाश प्रयोग किया जाता है एक hasOwnProperty जांच इस्तेमाल किया जाना चाहिए, लेकिन मुझे समझ नहीं आता क्यों ऐसी बात है ब्लॉगों की एक बहुत हैं। चेक के साथ और बिना दोनों हमें एक ही परिणाम मिलते हैं।hasOwnProperty अभी भी for..in बयानों के साथ उपयोग किया जाना चाहिए

this fiddle देखें।

+1

इस फीडल को देखें http://jsfiddle.net/gFmXM/1/ – goat

+0

@ रैंबोकोडर-धन्यवाद, अब मुझे यह मिल गया है –

उत्तर

11

आप {} के साथ एक बुनियादी वस्तु बना रहे हैं, या JSON.Parse का उपयोग कर JSON से यह हो रही हैं, तो hasOwnProperty विश्व स्तर पर बेकार है।

लेकिन यदि आप "वर्ग" का उपयोग कर रहे हैं (प्रोटोटाइप का उपयोग करके), तो यह आपको यह जानने में सहायता करता है कि क्या आप अपनी "अपनी संपत्तियों" (प्रत्यक्ष कार्यों सहित प्रत्यक्ष गुण) तक पहुंच रहे हैं या नहीं।

नोट एक बुनियादी वस्तु कम से कम एक (नहीं प्रत्यक्ष) संपत्ति है तो आप उसे एक for... in पाश में console.log({}); या console.log({}.toString) लेकिन it's not enumerable and not seen साथ पता लग सकता है कि: के लिए ... पाश में पुनरावृति नहीं है

एक गैर-गणना योग्य गुणों पर। ऐरे और ऑब्जेक्ट जैसे बिल्ट-इन कन्स्ट्रक्टरों से बनाए गए ऑब्जेक्ट्स में ऑब्जेक्ट.प्रोटोटाइप और स्ट्रिंग.प्रोटोटाइप से वंचित गैर-समेकित गुण हैं जो स्ट्रिंग की अनुक्रमणिकाऑफ विधि या ऑब्जेक्ट की टूस्ट्रिंग विधि जैसी संख्यात्मक नहीं हैं। लूप ऑब्जेक्ट के समृद्ध गुणों के सभी पर फिर से सक्रिय हो जाएगा या यह कन्स्ट्रक्टर के प्रोटोटाइप से प्राप्त होता है (जिसमें गुणों को अंतर्निहित किया गया है)।

+2

'हैऑनप्रोपर्टी' बेकार और आवश्यक नहीं है जब आपके पास कोड पर पूर्ण नियंत्रण नहीं है आपका पृष्ठ। कहें कि किसी ने क्रिस्टोफ के उत्तर में 'ऑब्जेक्ट.प्रोटोटाइप' को संशोधित किया है ..यहां तक ​​कि एक साधारण वस्तु के साथ आपको 'हैऑनप्रोपर्टी' के बिना अप्रत्याशित परिणाम मिलेंगे। – Radu

+0

मैं कहूंगा कि गड़बड़ कोड जो आपके पास पूर्ण नियंत्रण नहीं है * से एक अलग वस्तु है * {} के साथ मूल वस्तु बनाना, या इसे JSON से प्राप्त करना * –

10

hasOwnProperty के बिना आप नहीं जानते कि यह संपत्ति आपके ऑब्जेक्ट की मूल संपत्ति है या इसके प्रोटोटाइप से विरासत में है या नहीं।

Your modified fiddle

var obj1 = {a:"10",b:"20"}; 

Object.prototype.c = "prototype:30"; 

var i; 
for(i in obj1) { 
    document.getElementById("div1").innerHTML += obj1[i]+" "; 
} 
// result 10 20 prototype:30 

for(i in obj1) { 
    if(obj1.hasOwnProperty(i)) { 
     document.getElementById("div2").innerHTML += obj1[i] +" "; 
    }   
} 
// result 10 20 
​ 

इस मामले obj1 में प्रोटोटाइप Object है और आप ग़लती से अपना पहला पाश में यह सूची होगा इसे से संपत्ति c इनहेरिट करती है।

1

अक्सर आप hasOwnProperty के साथ या बिना एक ही परिणाम प्राप्त करेंगे, लेकिन बाद वाले व्यक्ति को संपत्ति में सीधे रहने के बजाय विरासत में प्राप्त संपत्तियों को अनदेखा कर दिया जाता है।

इस मूल विरासत प्रणाली पर विचार करें। कुत्ते मास्टर पशु वर्ग से विरासत में हैं।

function Animal(params) { this.is_animal = true; } 
function Dog(params) { for (var i in params) this[i] = params[i]; } 
Dog.prototype = new Animal(); 
var fido = new Dog({name: 'Fido'}); 

अगर हम fido में झाँकने, hasOwnProperty हमें पता लगाना जो अपने स्वयं के गुण (नाम) और जो विरासत में मिला रहे हैं मदद करता है।

for (var i in fido) if (fido.hasOwnProperty(i)) alert(i+' = '+fido[i]); 

... name=Fido लेकिन नहीं is_animal=true सचेत करता है।

संबंधित मुद्दे