जावास्क्रिप्ट में hasOwnProperty में संपत्ति क्या है?


96

विचार करें:

if (someVar.hasOwnProperty('someProperty') ) {
 // Do something();
} else {
 // Do somethingElse();
}

का सही उपयोग / स्पष्टीकरण क्या है hasOwnProperty('someProperty')?

someVar.somePropertyअगर किसी वस्तु someVarमें नाम के साथ संपत्ति है, तो हम इसका उपयोग क्यों नहीं कर सकते someProperty?

इस मामले में एक संपत्ति क्या है?

यह जावास्क्रिप्ट किस संपत्ति की जाँच करता है?



जब मैंने यह सवाल पूछा तो मुझे लगा कि यह एक फ़ंक्शन है जो कुछ html की जाँच करता है। अब मैं इसे उस वस्तु या विधि के भीतर एक 'चर' के लिए एक जावास्क्रिप्ट ऑब्जेक्ट या विधि की जाँच करते हुए देखता हूं। thnx!
फ्लाई

जवाबों:


165

hasOwnPropertyएक बूलियन मान लौटाता है जो दर्शाता है कि आप जिस वस्तु पर कॉल कर रहे हैं उसके पास तर्क के नाम के साथ एक संपत्ति है। उदाहरण के लिए:

var x = {
    y: 10
};
console.log(x.hasOwnProperty("y")); //true
console.log(x.hasOwnProperty("z")); //false

हालाँकि, यह ऑब्जेक्ट की प्रोटोटाइप श्रृंखला को नहीं देखता है।

जब आप for...inनिर्माण के साथ किसी वस्तु के गुणों की गणना करते हैं तो इसका उपयोग करना उपयोगी होता है ।

यदि आप पूर्ण विवरण देखना चाहते हैं, तो ES5 विनिर्देश हमेशा की तरह, देखने के लिए एक अच्छी जगह है।


6
प्रोटोटाइप श्रृंखला के लिए बोनस अंक। फिर भी यह पता लगाने की कोशिश की जा रही है कि किसी वस्तु पर कॉल न करने पर इसकी कॉलिंग क्या है ... इसके नहींwindow
क्रिस्टोफर सॉल-स्टॉरगार्ड

@KristofferSHansen - मुझे भी आश्चर्य हो रहा था, लेकिन प्रश्न को संपादित कर दिया गया है, इसलिए अब इसे एक वस्तु पर बुलाया जा रहा है। जब यह नहीं होता है, तो एक त्रुटि डाली जाती है।
जेम्स एलाडाइस

मुझे लगता है कि चीजें बदल जाती हैं। क्रोम में कंसोल से चलने पर कोई त्रुटि नहीं।
क्रिस्टोफ़र साल्-स्टोर्गार्ड

@KristofferSHansen - मुझे लगता है कि इस वजह से सांत्वना कोड चलता है (यह evalवैश्विक या फ़ंक्शन कोड के बजाय कोड के रूप में चलाया जाता है )। मैंने इसे रिक्त HTML पृष्ठ में आज़माया और "null to object to object" त्रुटि प्राप्त नहीं कर सकता।
जेम्स एलार्डिस

@KristofferSHansen कुणाल वशिष्ठ का उत्तर तब देखते हैं जब इसे एक वर्ग विधि पर बुलाया जाता है
FLY

25

यहाँ एक छोटा और सटीक उत्तर है:

जावास्क्रिप्ट में, प्रत्येक वस्तु में अंतर्निहित कुंजी-मूल्य जोड़े का एक गुच्छा होता है, जिसमें ऑब्जेक्ट के बारे में मेटा जानकारी होती है। जब आप for...inकिसी ऐसे ऑब्जेक्ट के लिए कंस्ट्रक्शन / लूप का उपयोग करके सभी महत्वपूर्ण-वैल्यू पेयर के माध्यम से लूप करते हैं, जो आप इस मेटा-इंफॉर्मेशन की-वैल्यू पेयर के माध्यम से भी लूप कर रहे हैं (जो आप निश्चित रूप से नहीं चाहते हैं)।

यहां छवि विवरण दर्ज करें

मेटा जानकारी के माध्यम hasOwnPropery(property) से इन अनावश्यक लूपिंग का उपयोग करते हुए और सीधे जाँचता है कि पैरामीटर propertyऑब्जेक्ट में उपयोगकर्ता द्वारा दी गई संपत्ति है या नहीं। द्वारा फिल्टर-आउट , मेरा मतलब है, कि hasOwnProperty(property)नहीं लगती है, propertyवस्तु के प्रोटोटाइप श्रृंखला उर्फ मेटा जानकारी में मौजूद है।

यह true/falseउसी के आधार पर बूलियन देता है।

यहाँ एक उदाहरण है:

var fruitObject = {"name": "Apple", "shape": "round", "taste": "sweet"};
console.log(fruitObject.hasOwnProperty("name"));  //true
console.log(Object.prototype.hasOwnProperty("toString");) //true because in above snapshot you can see, that there is a function toString in meta-information

मुझे आशा है कि यह स्पष्ट है!


अपने उदाहरण के अंतिम पंक्ति में आप लिखते हैं console.log(Object.prototype....; क्या आपका मतलब था console.log(fruitObject.? fruitObject या ऑब्जेक्ट?
हामिद अराघी

> "क्या आप इस मेटा जानकारी कुंजी-मान जोड़ों के माध्यम से भी पाशन कर रहे हैं" लेकिन जब मैं चलाने के for (var key in fruitObject) { ... }जे एस क्रम परिवर्तन जिस तरह से वैसे भी केवल गैर प्रोटोटाइप कुंजी के माध्यम से चक्र के js, मैं कुछ याद आ रही है या था वे के लिए संभाल कुंजी-इन-वस्तु छोरों?
चिकनफेट

13

यह जाँच करता है:

एक बूलियन मान लौटाता है जो दर्शाता है कि किसी ऑब्जेक्ट में निर्दिष्ट नाम के साथ कोई संपत्ति है या नहीं

HasOwnProperty विधि रिटर्न सच अगर वस्तु निर्दिष्ट नाम का एक गुण, झूठी अगर ऐसा नहीं होता है। यह विधि यह नहीं जांचती है कि क्या संपत्ति ऑब्जेक्ट की प्रोटोटाइप श्रृंखला में मौजूद है; संपत्ति वस्तु का ही सदस्य होना चाहिए।

उदाहरण:

var s = new String("Sample");
document.write(s.hasOwnProperty("split"));                        //false
document.write(String.prototype.hasOwnProperty("split"));         //true

2
मैंने एक -1 दिया क्योंकि आपका प्रारंभिक उत्तर एक छोटा और पूरी तरह से असंगत वाक्य था, जिसे तब थोड़ा लंबा, थोड़ा अधिक सुसंगत, लेकिन पूरी तरह से गलत वाक्य में अद्यतन किया गया था।

@ amnotiam- लेकिन मुझे लगता है कि यह अब बहुत स्पष्ट है ... इसका कारण यह है कि मेरे इंटरनेट का मुद्दा मैं अधिक पोस्ट करने में सक्षम नहीं हो सकता ..........
प्रणय राणा

12

सारांश:

hasOwnProperty()एक फ़ंक्शन है जिसे किसी भी ऑब्जेक्ट पर कॉल किया जा सकता है और इनपुट के रूप में एक स्ट्रिंग लेता है। यह एक बूलियन लौटाता है जो कि trueयदि संपत्ति ऑब्जेक्ट पर स्थित है, अन्यथा यह गलत है। hasOwnProperty()पर स्थित है Object.prototypeऔर इस प्रकार किसी भी वस्तु के लिए उपलब्ध है।

उदाहरण:

function Person(name) {
  this.name = name;
}

Person.prototype.age = 25;

const willem = new Person('willem');

console.log(willem.name); // Property found on object
console.log(willem.age); // Property found on prototype

console.log(willem.hasOwnProperty('name')); // 'name' is on the object itself
console.log(willem.hasOwnProperty('age')); // 'age' is not on the object itself

इस उदाहरण में एक नया व्यक्ति ऑब्जेक्ट बनाया गया है। प्रत्येक व्यक्ति का अपना नाम होता है जिसे निर्माणकर्ता में आरंभिक रूप दिया जाता है। हालाँकि, आयु वस्तु पर नहीं बल्कि वस्तु के प्रोटोटाइप पर स्थित है। इसलिए नाम और उम्र के लिए hasOwnProperty()वापसी करता है ।truefalse

व्यवहारिक अनुप्रयोग:

hasOwnProperty()for inलूप का उपयोग करके किसी ऑब्जेक्ट पर लूपिंग करते समय बहुत उपयोगी हो सकता है । आप इसके साथ जांच कर सकते हैं कि गुण ऑब्जेक्ट से ही हैं और प्रोटोटाइप नहीं हैं। उदाहरण के लिए:

function Person(name, city) {
  this.name = name;
  this.city = city;
}

Person.prototype.age = 25;

const willem = new Person('Willem', 'Groningen');

for (let trait in willem) {
  console.log(trait, willem[trait]); // This loops through all properties, including the prototype
}

console.log('\n');

for (let trait in willem) {
  if (willem.hasOwnProperty(trait)) { // This loops only through 'own' properties of the object
    console.log(trait, willem[trait]);
  }
}


3

आप object.hasOwnProperty (का उपयोग पी यदि एक वस्तु एक है निर्धारित करने के लिए) गणनीय संपत्ति पी - -

एक ऑब्जेक्ट का अपना स्वयं का प्रोटोटाइप हो सकता है, जहां 'डिफ़ॉल्ट' तरीके और विशेषताएं ऑब्जेक्ट के हर उदाहरण को सौंपी जाती हैं। hasOwnProperty केवल उन गुणों के लिए सही है जो विशेष रूप से निर्माता में सेट किए गए थे, या बाद में उदाहरण में जोड़े गए।

यह निर्धारित करने के लिए कि ऑब्जेक्ट के लिए कहीं भी p को परिभाषित किया गया है, अगर () का उपयोग करें पी) का Instof ऑब्जेक्ट) का उपयोग करें, जहां p एक गुण-नाम स्ट्रिंग का मूल्यांकन करता है।

उदाहरण के लिए, डिफ़ॉल्ट रूप से सभी ऑब्जेक्ट में एक 'toString' विधि होती है, लेकिन यह hasOwnProperty में दिखाई नहीं देगी।


2

hasOwnProperty एक सामान्य जावास्क्रिप्ट फ़ंक्शन है जो एक स्ट्रिंग तर्क लेता है।

आपके मामले में somevar.hasOwnProperty('someProperty'), यह somevarफ़ंक्शन की जाँच करता हैsomepropery या नहीं - यह सही और गलत है।

कहो

function somevar() {
    this.someProperty = "Generic";
}

function welcomeMessage()
{
    var somevar1 = new somevar();
    if(somevar1.hasOwnProperty("name"))
    {
        alert(somevar1.hasOwnProperty("name")); // It will return true
    }
}

2

hasOwnPropertyएक वस्तु की जाँच का एक उचित तरीका है एक संपत्ति है या नहीं। someVar.somePropertyइस स्थिति के विकल्प के रूप में इस्तेमाल नहीं किया जा सकता है। निम्नलिखित हालत एक अच्छा अंतर दिखाएगा:

const someVar = { isFirst: false };


// The condition is true, because 'someVar' has property 'isFirst'
if (someVar.hasOwnProperty('isFirst')) {
  // Code runs
}


// The condition is false, because 'isFirst' is false.
if (someVar.isFirst) {
  // Code does not runs here
}

इसलिए someVar.isFirstइसका उपयोग नहीं किया जा सकता है someVar.hasOwnProperty('isFirst')


-1

दृश्य ए:

const objA = { a: 1, b: 2 }
for (const key in objA) {
  if (objA.hasOwnProperty(key)) {
    console.log(objA[key])
  }
}

    Output

    1
    2

दृश्य बी:

const objB = {
  a: 1,
  b: 2,
  hasOwnProperty() {
    return false
  }
}

for (const key in objB) {
  if (objB.hasOwnProperty(key)) {
    console.log(objB[key])
  }
}

    Outputs nothing

क्योंकि जावास्क्रिप्ट hasOwnProperty की संपत्ति की रक्षा नहीं करता है। तो आप इसे इस तरह से उपयोग कर सकते हैं:

for (const key in objB) {
  if (Object.prototype.hasOwnProperty.call(obj, key)) {
    console.log(objB[key])
  }
}

-2

यह जांचता है कि किसी वस्तु में संपत्ति है या नहीं । यह वही काम करता है if(obj.prop), जहां तक ​​मुझे पता है।


7
obj.propप्रोटोटाइप श्रृंखला का अनुसरण hasOwnPropertyकरता है , नहीं
क्रिस्टोफ़र साल्-स्टोर्गार्ड

12
समस्या तब है जब propझूठे मूल्य हैं। if(obj.hasOwnProperty('prop'))हो जाएगा true, जबकि if(obj.prop)हो जाएगा false
रॉड्रिगो सालिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.