मैं निम्नलिखित तर्क में Object.prototype पद्धति का उपयोग कैसे कर सकता हूं?


94

मैं दिए गए कुंजी के i18n स्ट्रिंग प्राप्त करने के लिए निम्नलिखित तर्क का उपयोग कर रहा हूं।

export function i18n(key) {
  if (entries.hasOwnProperty(key)) {
    return entries[key];
  } else if (typeof (Canadarm) !== 'undefined') {
    try {
      throw Error();
    } catch (e) {
      Canadarm.error(entries['dataBuildI18nString'] + key, e);
    }
  }
  return entries[key];
}

मैं अपने प्रोजेक्ट में ESLint का उपयोग कर रहा हूं। मुझे निम्नलिखित त्रुटि प्राप्त हो रही है:

टारगेट ऑब्जेक्ट से Object.prototype पद्धति 'hasOwnProperty' का उपयोग न करें। यह एक ' नो-प्रोटोटाइप-बिल्डिन्स ' त्रुटि है।

इस त्रुटि को हल करने के लिए मैं अपना कोड कैसे बदलूं? मैं इस नियम को अक्षम नहीं करना चाहता।


10
आपको शायद डॉक्स पढ़ना चाहिए। सही कोड के उदाहरण हैं ~ eslint.org/docs/rules/no-prototype-builtins
Phil

1
आप का उपयोग करने का सुझाव Object.hasOwnProperty(entries,key)?
जुनून

कोड ठीक काम कर रहा है। यह एक लाइनिंग त्रुटि है। मैं सिंटैक्स को संशोधित करना चाहता हूं ताकि लाइनिंग नियम संतुष्ट हो जाए।
अक्टूबर को booYah

1
@ पारगमन कि स्ट्रिंग के साथ एक संपत्ति है entries, तो नजरअंदाज, नजरअंदाज keyऔर जाँच करेगा Object
ओरोल

जवाबों:


164

आप इसे इसके माध्यम से एक्सेस कर सकते हैं Object.prototype:

Object.prototype.hasOwnProperty.call(obj, prop);

यह सुरक्षित होना चाहिए, क्योंकि

  • सभी वस्तुएं विरासत में नहीं मिलीं Object.prototype
  • यहां तक ​​कि जिन वस्तुओं को विरासत में मिला है Object.prototype, उनके लिए hasOwnPropertyविधि कुछ और ही हो सकती है।

बेशक, ऊपर कोड मानता है कि

  • वैश्विक Objectछाया या पुनर्परिभाषित नहीं किया गया है
  • मूल निवासी Object.prototype.hasOwnPropertyको फिर से परिभाषित नहीं किया गया है
  • callअपनी कोई संपत्ति नहीं जोड़ी गई हैObject.prototype.hasOwnProperty
  • मूल निवासी Function.prototype.callको फिर से परिभाषित नहीं किया गया है

यदि इनमें से कोई भी पकड़ में नहीं आता है, तो सुरक्षित तरीके से कोड करने का प्रयास करते हुए, आप अपना कोड तोड़ सकते हैं!

एक और दृष्टिकोण जिसकी आवश्यकता नहीं callहै

!!Object.getOwnPropertyDescriptor(obj, prop);

16

आपके विशिष्ट मामले के लिए, निम्नलिखित उदाहरण काम करेंगे:

if(Object.prototype.hasOwnProperty.call(entries, "key")) {
    //rest of the code
}

या

if(Object.prototype.isPrototypeOf.call(entries, key)) {
    //rest of the code
}

या

if({}.propertyIsEnumerable.call(entries, "key")) {
    //rest of the code
}

11

ऐसा लगता है कि यह भी काम करेगा:

key in entries

चूँकि उस वस्तु के अंदर कुंजी मौजूद है या नहीं, इस पर बूलियन वापस आ जाएगा।


3
hasOwnPropertyजाँचता है कि क्या एक स्ट्रिंग या प्रतीक स्वयं की संपत्ति है। key in entriesजाँच करता है कि यह अपना है या विरासत में मिला है।
ओरोल

0

मुझे आशा है कि मैं इस के लिए नीचा नहीं होगा, शायद होगा, लेकिन!

var a = {b: "I'm here"}
if (a["b"]) { console.log(a["b"]) }
if (a["c"]) { console.log("Never going to happen") }

इंसोफर ने मेरा कोड कभी नहीं तोड़ा है, लेकिन मुझे यकीन नहीं है कि यह सभी वेब ब्राउज़रों में ऐसा है ...

(इसके अलावा, यदि Canadarmअपरिभाषित है, तो आपका कोड लगता है return entries[key];कि कुंजी प्रविष्टियों में नहीं है ...)


1
समस्या यह है कि अगर aएक प्रोटोटाइप है जो DOES है c, वह होने वाला है। जेएस प्रोटोटाइप श्रृंखला ऊपर जाएगा
बर्नार्डो दाल कॉर्नो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.