javascript गुण-गैर-गुणकारी बनाने के क्या लाभ हैं?




prototype enumerable (3)

  • संपत्ति को गैर-योग्य बनाकर आप अभी भी इसे एक्सेस कर सकते हैं। लेकिन जब आप वस्तु पर लूप के लिए आवेदन करते हैं तो गैर-प्राप्य संपत्ति को पुनरावृत्त नहीं किया जाएगा।
  • पहला बिंदु देखें
  • अंतर्निहित वस्तुओं के निहित गुण (जैसे पुश, पॉप, स्टर्लिंग ...) असंख्य नहीं हैं

    var o = {a:1, b:2, c:3} // a,b,c are enumerable properties
    o.propertyIsEnumerable("toString") // returns false, because it is a inherited property
    for(p in o) console.log(p); // this loop will print a,b and c but not toString or other inherited properies

Enumerability एक संपत्ति के तीन गुणों में से एक है: लेखन क्षमता, enumerability और विन्यास। मेरे प्रश्न हैं:

  • जावास्क्रिप्ट में गैर-गुणांक बनाने के लिए क्या लाभ हैं? मुझे पता है कि हम उन्हें गैर-संपत्ति बनाकर संपत्ति छिपा रहे हैं, लेकिन संपत्ति छिपाने के क्या लाभ हैं?
  • क्या हम नॉन-एनुमेरबल प्रॉपर्टीज को एक्सेस कर सकते हैं? यदि हाँ, तो उन्हें गैर-गणना योग्य बनाने से क्या लाभ है?
  • क्या वस्तुओं के सभी पूर्वनिर्धारित गुण गैर-गणना योग्य हैं? जैसे कि ऐरे के pop और push प्रॉपर्टी के नॉन-एनेमरेबल होने का मामला?

मुझे लगता है कि मुख्य लाभ यह है कि किसी वस्तु के गुण, जैसे कि या Object.keys() for in गणना करते समय क्या दिखाया जाए, उसे नियंत्रित करने में सक्षम होना चाहिए।

MDN इसे Object.defineProperty साथ अच्छी तरह से Object.defineProperty : https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/defineProperty

आम तौर पर, जब लोग Object कोई विधि जोड़ना चाहते हैं, जैसे कि पुराने ब्राउज़र में समर्थित किसी विधि के लिए .prototype , तो वे .prototype संशोधित करते हैं। लेकिन यह संपत्ति को असंख्य बनाता है और लूप्स / कीज़ कलेक्शन (जो बिना उपयोग किए .hasOwnProperty ... जो कि हर कोई उपयोग नहीं करता है) में लौटा देता है।

तो इसके बजाय कुछ की तरह:

Object.prototype.myMethod = function () {
    alert("Ahh");
};

आप स्पष्ट रूप से यह कहने योग्य नहीं है कि कहने के लिए Object.defineProperty का उपयोग कर सकते हैं:

Object.defineProperty(Object.prototype, 'myMethod', {
    value: function () {
        alert("Ahh");
    },
    enumerable: false
});

इस तरह, उदाहरण के लिए जब आप for (var key in obj) उपयोग for (var key in obj) , तो "myMethod" एक आइटम नहीं होगा, और आपको .hasOwnProperty का उपयोग करने के बारे में चिंता करने की आवश्यकता नहीं होगी। इसके साथ मुख्य समस्या यह है कि कुछ ब्राउज़र इसका समर्थन नहीं करते हैं: http://kangax.github.com/es5-compat-table/ और यह कि सभी लाइब्रेरी / कोड इसका उपयोग नहीं करते हैं, इसलिए आप हमेशा भरोसा नहीं कर सकते बाहरी पुस्तकालयों / कोड पर सही ढंग से और हर समय उपयोग करने के लिए।

आप किसी भी समय किसी भी गैर-प्राप्य संपत्ति का उपयोग कर सकते हैं, यह तब नहीं दिखाई देगा जब ऑब्जेक्ट के गुणों की गणना करना हो - यही मुख्य बिंदु है।

और मेरा मानना ​​है कि वस्तुओं के सभी "पूर्वनिर्धारित" गुण गैर-गणना योग्य हैं। इसके द्वारा, मैं वास्तव में केवल मूल गुणों का मतलब है, जरूरी नहीं कि विरासत में मिला या बनाया गया हो। तो आपके उदाहरण के साथ, pop और push की गणना नहीं की जाएगी, लेकिन Array.prototype.indexOf होगा यदि इसे किसी पुराने ब्राउज़र पर Array.prototype.indexOf के रूप में बनाया जाए जो उस पद्धति का समर्थन नहीं करता है ... जो निश्चित रूप से बचा जा सकता है। ऊपर मेरे उदाहरण की तरह Object.defineProperty का उपयोग करके। एक अन्य उदाहरण length संपत्ति है, जिसे खत्म नहीं किया गया है।

यहाँ एक उदाहरण सामान्य रूप से दिया गया है: http://jsfiddle.net/aHJ3g/

Object.keys का उपयोग और परिभाषा महत्वपूर्ण है: "किसी दिए गए ऑब्जेक्ट के स्वयं के असंख्य गुणों की एक सरणी देता है, उसी क्रम में जो for-in लूप द्वारा प्रदान की जाती है (अंतर यह है कि for-in लूप गुणों को एन्यूमरेट करता है) प्रोटोटाइप श्रृंखला के रूप में अच्छी तरह से) " - MDN से - https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/keys


जैसा कि मैं देख रहा हूं, एक और प्रमुख लाभ यह है कि यह किसी वस्तु के निजी गुणों को सार्वजनिक नामस्थान को प्रदूषित करने से रोकता है।

कहें कि आपने Cosmos नामक एक शक्तिशाली पुस्तकालय बनाया और प्रकाशित किया है। उपयोगकर्ता नोड इंटरप्रेटर को फायर करता है और कंस्ट्रक्टर को कॉल करके इसका एक नया उदाहरण बनाता है:

var Cosmos = require('Cosmos');
var cosmos = new Cosmos('my empire');

अब उपयोगकर्ता बस cosmos टाइप करता है और प्रेस यह देखने के लिए दर्ज करता है कि यह सार्वजनिक एपीआई किसका समर्थन करता है। आप दोनों में से किसे देखना चाहते हैं?

{ name: 'my empire',
  grow: [Function: grow],
  addStar: [Function: addStar],
  beautify: [Function: beautify],
  implode: [Function: implode],
  destroy: [Function: destroy] }

या

{ _age: 25000,
  _size: 35000,
  _destroyed: false,
  name: 'my empire',
  _numStars: 200,
  _init: [Function: _init],
  grow: [Function: grow],
  _grow: [Function: _grow],
  addStar: [Function: addStar],
  _checkStatus: [Function: _checkStatus],
  beautify: [Function: beautify],
  implode: [Function: implode],
  destroy: [Function: destroy] }




enumerable