मैं उन उत्तरों से वास्तव में भ्रमित हूं जो दिए गए हैं - उनमें से ज्यादातर केवल एकमुश्त गलत हैं। बेशक आपके पास ऑब्जेक्ट गुण हो सकते हैं जिनके पास अपरिभाषित, अशक्त या गलत मान हैं। तो बस संपत्ति की जांच को कम करना typeof this[property]
, या इससे भी बदतर, x.key
आपको पूरी तरह से भ्रामक परिणाम देगा।
यह इस बात पर निर्भर करता है कि आप क्या खोज रहे हैं। यदि आप जानना चाहते हैं कि क्या किसी वस्तु में भौतिक रूप से संपत्ति है (और यह प्रोटोटाइप श्रृंखला पर कहीं से नहीं आ रही है) तो object.hasOwnProperty
जाने का रास्ता है। सभी आधुनिक ब्राउज़र इसका समर्थन करते हैं। (यह सफारी के पुराने संस्करणों - 2.0.1 और पुराने में गायब था - लेकिन ब्राउज़र के उन संस्करणों का उपयोग शायद ही कभी किया जाता है।)
यदि आप जिस चीज की तलाश कर रहे हैं, यदि कोई वस्तु उस पर एक संपत्ति है जो चलने योग्य है (जब आप वस्तु के गुणों पर पुनरावृति करते हैं, तो वह दिखाई देगा) तब करना: prop in object
आपको अपना वांछित प्रभाव देगा।
चूंकि उपयोग hasOwnProperty
करना संभव है कि आप क्या चाहते हैं, और यह देखते हुए कि आप एक पतन विधि चाहते हैं, मैं आपके लिए निम्न समाधान प्रस्तुत कर सकता हूं:
var obj = {
a: undefined,
b: null,
c: false
};
// a, b, c all found
for ( var prop in obj ) {
document.writeln( "Object1: " + prop );
}
function Class(){
this.a = undefined;
this.b = null;
this.c = false;
}
Class.prototype = {
a: undefined,
b: true,
c: true,
d: true,
e: true
};
var obj2 = new Class();
// a, b, c, d, e found
for ( var prop in obj2 ) {
document.writeln( "Object2: " + prop );
}
function hasOwnProperty(obj, prop) {
var proto = obj.__proto__ || obj.constructor.prototype;
return (prop in obj) &&
(!(prop in proto) || proto[prop] !== obj[prop]);
}
if ( Object.prototype.hasOwnProperty ) {
var hasOwnProperty = function(obj, prop) {
return obj.hasOwnProperty(prop);
}
}
// a, b, c found in modern browsers
// b, c found in Safari 2.0.1 and older
for ( var prop in obj2 ) {
if ( hasOwnProperty(obj2, prop) ) {
document.writeln( "Object2 w/ hasOwn: " + prop );
}
}
उपरोक्त एक कार्य, क्रॉस-ब्राउज़र, hasOwnProperty
एक केविट के साथ समाधान है : यह उन मामलों के बीच अंतर करने में असमर्थ है जहां एक समान संपत्ति प्रोटोटाइप और उदाहरण के लिए है - यह सिर्फ यह मानता है कि यह प्रोटोटाइप से आ रहा है। आप इसे अपनी स्थिति के आधार पर अधिक उदार या सख्त होने के लिए स्थानांतरित कर सकते हैं, लेकिन कम से कम यह अधिक उपयोगी होना चाहिए।