2009-10-21 16 views
38

मैंने पढ़ा है कि केवल कार्यों का एक समूह लिखने के बजाय, मुझे ऑब्जेक्ट शाब्दिक का उपयोग करना चाहिए।जावास्क्रिप्ट - ऑब्जेक्ट का लाभ शाब्दिक

क्या कोई बता सकता है कि ऑब्जेक्ट शाब्दिक के फायदे उदाहरणों के साथ हैं, क्योंकि मुझे अब तक समझ में नहीं आता है।

धन्यवाद

उत्तर

64

के रूप में रस कैम ने कहा, आप ग्लोबल नेम स्पेस है, जो कई स्थानों (TinyMCE, आदि से स्क्रिप्ट के संयोजन के इन दिनों में बहुत महत्वपूर्ण है प्रदूषण से बचने)।

जैसा कि एलेक्स सेक्स्टन ने कहा, यह भी अच्छे कोड संगठन के लिए बनाता है।

यदि आप इस तकनीक का उपयोग कर रहे हैं, तो मैं मॉड्यूल पैटर्न का उपयोग करने का सुझाव दूंगा। यह अभी भी वस्तु शाब्दिक का उपयोग करता है, लेकिन एक scoping समारोह से लौटने के मूल्य के रूप में:

var MyThingy = (function() { 

    function doSomethingCool() { 
     ... 
    } 

    function internalSomething() { 
     .... 
    } 

    function anotherNiftyThing() { 
     // Note that within the scoping function, functions can 
     // call each other direct. 
     doSomethingCool(); 
     internalSomething(); 
    } 

    return { 
     doSomethingCool: doSomethingCool, 
     anotherNiftyThing: anotherNiftyThing 
    }; 
})(); 

बाहरी उपयोग:

MyThingy.doSomethingCool(); 

scoping समारोह अपने कार्यों के सभी के चारों ओर लिपटा है, और फिर आप इसे तुरंत फोन और इसके वापसी मूल्य स्टोर करें। लाभ:

  • कार्य सामान्य रूप से घोषित किया गया है और इसलिए नाम है। (जबकि {name: function() { ... }} प्रारूप के साथ, आपके सभी फ़ंक्शन अज्ञात हैं, भले ही उनके संदर्भ में गुणों का नाम हो।) नाम आपको मदद करने में मदद करते हैं, एक डिबगर में कॉल स्टैक दिखाने से, आपको यह बताने के लिए कि किस कार्य ने अपवाद फेंक दिया है। (2015 अपडेट: नवीनतम जावास्क्रिप्ट विनिर्देश, ईसीएमएस्क्रिप्ट 6 वां संस्करण, जावास्क्रिप्ट इंजन को infer फ़ंक्शन का नाम होना चाहिए, इसकी एक बड़ी संख्या को परिभाषित करता है। उनमें से एक यह है कि फ़ंक्शन को हमारे {name: function() { ... }} उदाहरण के रूप में किसी संपत्ति को सौंपा गया है। इंजन ईएस 6 लागू करते हैं, यह कारण दूर जाएगा।)
  • आपको केवल अपने मॉड्यूल (जैसे कि मेरे internalSomething ऊपर) द्वारा उपयोग किए जाने वाले निजी कार्यों की स्वतंत्रता देता है। पृष्ठ पर कोई अन्य कोड उन कार्यों को कॉल कर सकता है; वे वास्तव में निजी हैं। केवल वही जो आप अंत में निर्यात करते हैं, रिटर्न स्टेटमेंट में, स्कोपिंग फ़ंक्शन के बाहर दिखाई दे रहे हैं।
  • पर्यावरण के आधार पर विभिन्न कार्यों को वापस करना आसान बनाता है, अगर कार्यान्वयन पूरी तरह से बदलता है (जैसे आईई-बनाम-डब्ल्यू 3 सी सामान, या एसवीजी बनाम कैनवास आदि)।

विभिन्न कार्यों लौटने का उदाहरण:

var MyUtils = (function() { 
    function hookViaAttach(element, eventName, handler) { 
     element.attachEvent('on' + eventName, handler); 
    } 

    function hookViaListener(element, eventName, handler) { 
     element.addEventListener(eventName, handler, false); 
    } 

    return { 
     hook: window.attachEvent ? hookViaAttach : hookViaListener 
    }; 
})(); 

MyUtils.hook(document.getElementById('foo'), 'click', /* handler goes here */); 
+2

जब आप "अज्ञात" तरीके से फ़ंक्शन को तुरंत चालू करते हैं, तो आप इसे अभी भी एक नाम दे सकते हैं (var x = function x() {...})। जब आप ऐसा करते हैं, तो नाम इस तरह बाध्य होता है कि यह फ़ंक्शन के भीतर रिकर्सिव संदर्भों के लिए उपलब्ध है। – Pointy

+1

@Pointy: आप ऐसा नहीं कर सकते (एक असाइनमेंट के भीतर फ़ंक्शन नाम का उपयोग करें) क्रॉस-ब्राउज़र, यह आईई या सफारी पर सही ढंग से काम नहीं करता है; विवरण: http://yura.thinkweb2.com/named-function-expressions/ और आपको फ़ंक्शन का उचित नाम ('foo' 'फ़ंक्शन foo' में) की आवश्यकता नहीं है, पूरे दायरे में इन-स्कोप है यह घोषित किया गया है, जिसमें फ़ंक्शन के भीतर भी शामिल है, इसलिए 'foo' प्रतीक' foo' के माध्यम से स्वयं को कॉल कर सकता है, किसी भी चीज़ (उस बिंदु पर) के संदर्भ संदर्भ को निर्दिष्ट करने की आवश्यकता नहीं है। –

+0

(जारी रखने) यह माना जाता है कि यह * अच्छा * एक ही समय में असाइनमेंट और उचित नाम दोनों का उपयोग करने में सक्षम होगा क्योंकि यह स्कोपिंग फ़ंक्शन से कार्यों को निर्यात करना आसान बनाता है। कल्पना निश्चित रूप से इसे अनुमति देता है, लेकिन दुख की बात है, व्यावहारिकता (कार्यान्वयन कीड़े) इसमें प्रवेश करती है। –

15

एक वस्तु शाब्दिक का उपयोग करना (उर्फ शाब्दिक पैटर्न वस्तु) कई कार्यों विश्व स्तर पर घोषित होगा का उपयोग कर के रूप में के रूप में गंभीर रूप से वैश्विक नामस्थान को दूषित नहीं होगा, और यह भी एक तार्किक फैशन

के लिए में कोड को व्यवस्थित करने में मदद करता है जैसे, इस वस्तु शाब्दिक

var obj = { 
       find : function(elem) { /* find code */ }, 
       doSomething: function() { /* doSomething code */ }, 
       doSomethingElse: function() { /* doSomethingElse code */ } 
      } 

function find(elem) { /* find code */ }, 
function doSomething() { /* doSomething code */ }, 
function doSomethingElse() { /* doSomethingElse code */ } 
की तुलना

तीन की तुलना में वैश्विक वस्तु पर केवल एक संपत्ति बनाएगा। फिर आप आसानी से ऐसा

obj.doSomething(); 
+2

आप केवल एक सामान्य फ़ंक्शन में कई फ़ंक्शन लिख सकते हैं और अपने कोड को प्रदूषित नहीं कर सकते हैं। ऑब्जेक्ट शाब्दिक कोई अतिरिक्त मूल्य नहीं देता है। मैं स्वयं प्रोटोटाइप विधि का उपयोग करता हूं .. – vsync

9

रेबेका Murphey जैसे कार्यों के लिए उपयोग कर सकते इस साल के jQuery सम्मेलन में वस्तु Literals पर एक टॉक किया था। उनका उपयोग करने के सबसे अच्छे कारणों में से एक बस अच्छा कोड संगठन है।

यहाँ वस्तु शाब्दिक पैटर्न पर रेबेका का लिखने निर्भर है: http://rmurphey.com/blog/2009/10/15/using-objects-to-organize-your-code/

+2

ऑब्जेक्ट अक्षर पर एक और महान लेख: http://www.wait-till-i.com/2006/02/16/show-love-to-the-object-literal/ –

2

Ive हमेशा वस्तु शाब्दिक इस्तेमाल किया क्योंकि वे कोड को व्यवस्थित करने के लिए एक स्पष्ट तरीका है। यही कारण है कि मुझे प्रोटोटाइप पसंद नहीं है, यह बहुत गन्दा है।

फ़ंक्शंस नाम स्थान को विनियमित नहीं करते हैं क्योंकि ऑब्जेक्ट अक्षर से अधिक किसी ऊपर वर्णित है।

आप आसानी से की तरह

var obj = {} 
var find = function(elem) { /* find code */ }, 
var doSomething = function() { /* doSomething code */ }, 
var doSomethingElse = function() { /* doSomethingElse code */ } 

जो वैश्विक वस्तुओं कार्यों के रूप में ही एक ही की बहुत सारी बनाने के द्वारा polute हैं एक शाब्दिक लिख सकते हैं। इसी तरह तुम कर सकते हो:

(function() { 
function find(elem) { /* find code */ }, 
function doSomething() { /* doSomething code */ }, 
function doSomethingElse() { /* doSomethingElse code */ } 
})(); 

जो उन वैश्विक वस्तुओं है कि जिस तरह से आप अभी भी वैश्विक वस्तुओं का भार नहीं बनाते नहीं बना होगा (सब कुछ जे एस में एक वस्तु है)

मेरे दिमाग ऑब्जेक्ट के लिए अक्षर के दो फायदे हैं। एक का उपयोग वे jQuery जैसे कई प्लगइन द्वारा किया जाता है, इसलिए लोग परिवार हैं और उन्हें पढ़ने में आसान है। प्लगइन में डेटा के माध्यम से पारित करना आसान बनाता है। सार्वजनिक और निजी दोनों विधियों को बनाना आसान है ....

वे धीमे हो सकते हैं, हर बार जब आप ऑब्जेक्ट का उदाहरण बनाते हैं तो इसकी सभी विधियां डुप्लीकेट होती हैं। यह मेरी समझ है कि प्रोटोटाइप के मामले में ऐसा नहीं है क्योंकि आपके पास विधियों की एक प्रति है और नए इंजेक्शन बस प्रोटोटाइप का संदर्भ देते हैं।

मैं निश्चित रूप से गलत हो सकता हूं ...

+1

ऑब्जेक्ट लेबल्स नेमस्पेसिंग और सिंगलेट्स के लिए अच्छे हैं, जब आप साझा व्यवहार वाले किसी ऑब्जेक्ट के कई उदाहरण बनाते हैं तो कन्स्ट्रक्टर फ़ंक्शंस का उपयोग करना बेहतर होगा। मुझे एक ऐसे मामले का पता नहीं मिला है जहां निजीकरण के लिए '_myPrivate' का उपयोग करके निजी तरीके से अनुकरण करके अधिक सीपीयू और स्मृति का उपभोग किया जाता है लेकिन अगर कोई मुझे एक प्रदान कर सकता है तो खुश होगा। प्रोटोटाइप, विरासत, यहां मिश्रण मिश्रण पर अधिक: http://stackoverflow.com/a/16063711/1641941 – HMR

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