दिलचस्प पोस्ट
ग्नोस्कोप और एक्सीलरोमीटर डेटा को जोड़ना कुशलता से एक पाठ फ़ाइल की लाइनों की संख्या की गिनती। (200MB +) क्या एंड्रॉइड में नकारात्मक मार्जिन का इस्तेमाल करना बुरा अभ्यास है? जावास्क्रिप्ट में नेस्टेड लूप से तोड़ने का सर्वोत्तम तरीका है? किसी इनपुट के प्रपत्र के माता-पिता कैसे प्राप्त करें? एंड्रॉइड स्टूडियो में * .so पुस्तकालय कैसे शामिल करें? मैं जावास्क्रिप्ट के साथ केवल Internet Explorer 11 को कैसे लक्षित कर सकता हूं? Android डिवाइस का प्राथमिक ई-मेल पता कैसे प्राप्त करें टेबल में प्राथमिक कुंजी के लिए सबसे अच्छा अभ्यास क्या है? .htaccess पुनर्निर्देशित http को https पर सूची में सबसे छोटा पूर्णांक नहीं मिला सी में बिल्टीन्ट को लागू करने का सबसे आसान तरीका क्या है? अबओप इनलाइन ब्लॉक के बीच का स्थान यदि तालिका SQL सर्वर में मौजूद है तो कैसे छोड़ें? CaptivNetwork को बहिष्कृत करने के बाद आईओएस 9 में वाईफ़ाई एसएसआईडी कैसे प्राप्त करें और वाईफ़ाई नाम के लिए कॉल पहले से ही अवरुद्ध है

`नई ऑब्जेक्ट () 'और ऑब्जेक्ट आर्टिकल नोटेशन के बीच अंतर क्या है?

ऑब्जेक्ट बनाने के लिए इस कन्स्ट्रक्टर-आधारित सिंटैक्स के बीच क्या अंतर है:

person = new Object() 

… और यह शाब्दिक सिंटैक्स:

 person = { property1 : "Hello" }; 

ऐसा प्रतीत होता है कि दोनों एक ही काम करते हैं, हालांकि जेएसएलआईफ़ ने आपको ऑब्जेक्ट आर्टिकल नोटेशन का उपयोग करने को पसंद किया है

कौन सा बेहतर है और क्यों?

वेब के समाधान से एकत्रित समाधान "`नई ऑब्जेक्ट () 'और ऑब्जेक्ट आर्टिकल नोटेशन के बीच अंतर क्या है?"

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

इन

 person = new Object() /*You should put a semicolon here too. It's not required, but it is good practice.*/ -or- person = { property1 : "Hello" }; 

तकनीकी रूप से एक ही बात मत करो पहले सिर्फ एक वस्तु बनाता है दूसरा एक बनाता है और एक संपत्ति प्रदान करता है पहले एक के समान होने के लिए आपको संपत्ति बनाने और असाइन करने के लिए दूसरा चरण की आवश्यकता होती है।

"असामान्य कुछ" जो कोई कर सकता है वह डिफ़ॉल्ट Object वैश्विक को छाया या असाइन करेगा:

 // Don't do this Object = 23; 

उस अत्यधिक-असामान्य मामले में, new Object विफल हो जाएगी लेकिन {} काम करेगा।

व्यवहार में, {} बजाय new Object का उपयोग करने का कोई कारण नहीं है (जब तक कि आपने यह बहुत ही असामान्य काम किया हो)।

आपके उदाहरण के रूप में बिना किसी साधारण वस्तु के लिए कोई अंतर नहीं है हालांकि, जब आप अपने ऑब्जेक्ट के तरीकों को जोड़ना शुरू करते हैं तो एक बड़ा अंतर होता है

शाब्दिक तरीका:

 function Obj( prop ) { return { p : prop, sayHello : function(){ alert(this.p); }, }; } 

प्रोटोटाइप मार्ग:

 function Obj( prop ) { this.p = prop; } Obj.prototype.sayHello = function(){alert(this.p);}; 

दोनों तरीकों से Obj के उदाहरणों को इस तरह से बनाने की अनुमति है:

 var foo = new Obj( "hello" ); 

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

जावास्क्रिप्ट में, हम दो तरीकों से एक नया खाली ऑब्जेक्ट घोषित कर सकते हैं:

 var obj1 = new Object(); var obj2 = {}; 

मुझे यह सुझाव देने के लिए कुछ भी नहीं मिला है कि इन दो के बीच कोई महत्वपूर्ण अंतर क्या है कि वे पर्दे के पीछे कैसे काम करते हैं (कृपया मुझे सही करें अगर मैं गलत हूं – मुझे जानना अच्छा लगेगा)। हालांकि, दूसरी विधि (ऑब्जेक्ट आर्टिकल नोटेशन का उपयोग करके) कुछ फायदे प्रदान करती है।

  1. यह छोटा है (10 अक्षरों का सटीक होना)
  2. यह आसान है, और मक्खी पर वस्तुओं का निर्माण करने के लिए अधिक संरचित है
  3. यह कोई फर्क नहीं पड़ता कि कुछ बगैर अनजाने में ऑब्जेक्ट को ओवरराइड किया गया है

एक नया ऑब्जेक्ट पर विचार करें जिसमें सदस्य नाम और टेलोन शामिल हैं नए ऑब्जेक्ट () सम्मेलन का उपयोग करते हुए, हम इसे इस तरह बना सकते हैं:

 var obj1 = new Object(); obj1.Name = "A Person"; obj1.TelNo = "12345"; 

जावास्क्रिप्ट की एक्सपांडो प्रॉपर्टीज की सुविधा हमें मक्खी पर इस तरह से नए सदस्यों को बनाने की अनुमति देती है, और हम जो भी इरादा चाहते हैं उन्हें प्राप्त कर सकते हैं। हालांकि, इस तरह से बहुत संरचित या समझाया नहीं है। क्या होगा अगर हम सृजन पर सदस्यों को विस्तारित करना चाहते हैं, बिना विस्तृत गुणों और असाइनमेंट के बाद के निर्माण पर भरोसा करने के लिए?

यह वह जगह है जहां ऑब्जेक्ट आंशिक संकेतन मदद कर सकता है:

 var obj1 = {Name:"A Person",TelNo="12345"}; 

यहां हमने एक ही पंक्ति के कोड में एक ही प्रभाव हासिल किया है और काफी कम वर्ण हैं।

एक और चर्चा ऊपर दिए गए ऑब्जेक्ट निर्माण विधियों पर पाया जा सकता है: जावास्क्रिप्ट और ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग (ओओपी)।

और अंत में, बेवकूफ जो ऑब्जेक्ट को ओवरराइड करते हैं? क्या आपको लगता है कि यह संभव नहीं था? खैर, ये जेएसफ़ील्ड अन्यथा सिद्ध करता है। ऑब्जेक्ट आभासी संकेतन का उपयोग हमें इस भोंदूरी के बावजूद गिरने से रोकता है।

( http://www.jameswiseman.com/blog/2011/01/19/jslint-messages-use-the-object-literal-notation/ से )

मेरी मशीन पर Node.js का उपयोग करते हुए, मैंने निम्नलिखित को चलाया:

 console.log('Testing Array:'); console.time('using[]'); for(var i=0; i<200000000; i++){var arr = []}; console.timeEnd('using[]'); console.time('using new'); for(var i=0; i<200000000; i++){var arr = new Array}; console.timeEnd('using new'); console.log('Testing Object:'); console.time('using{}'); for(var i=0; i<200000000; i++){var obj = {}}; console.timeEnd('using{}'); console.time('using new'); for(var i=0; i<200000000; i++){var obj = new Object}; console.timeEnd('using new'); 

ध्यान दें, यह यहां पाया गया है का एक विस्तार है: arr = [] arr = एआरआर = नए सरणी से क्यों अधिक है?

मेरा उत्पादन निम्न था:

 Testing Array: using[]: 1091ms using new: 2286ms Testing Object: using{}: 870ms using new: 5637ms 

इतनी स्पष्ट रूप से {} और [] खाली वस्तुएं / एरेज़ बनाने के लिए नए प्रयोग की तुलना में तेज़ हैं

यहां हर कोई दो की समानता के बारे में बात कर रहा है मैं मतभेदों को बताता हूँ

  1. new Object() का उपयोग करने से आप किसी अन्य ऑब्जेक्ट को पास कर सकते हैं। स्पष्ट परिणाम यह है कि नव निर्मित वस्तु उसी संदर्भ में सेट की जाएगी। यहां एक नमूना कोड है:

     var obj1 = new Object(); obj1.a = 1; var obj2 = new Object(obj1); obj2.a // 1 
  2. OOP ऑब्जेक्ट के रूप में उपयोग ऑब्जेक्ट तक सीमित नहीं है अन्य प्रकारों को इसके लिए भी पारित किया जा सकता है समारोह तदनुसार टाइप करेगा। उदाहरण के लिए यदि हम इसे पूर्णांक 1 पास करते हैं, तो हमारे लिए टाइप नंबर का एक ऑब्जेक्ट बनाया जाएगा।

     var obj = new Object(1); typeof obj // "number" 
  3. उपरोक्त विधि ( new Object(1) ) का उपयोग करके वस्तु को ऑब्जेक्ट प्रकार में कनवर्ट किया जाएगा यदि कोई सम्पत्ति इसके लिए जोड़ दी गई है।

     var obj = new Object(1); typeof obj // "number" obj.a = 2; typeof obj // "object" 
  4. यदि ऑब्जेक्ट ऑब्जेक्ट के एक बच्चे वर्ग की एक प्रति है, तो हम टाइप रूपांतरण के बिना संपत्ति जोड़ सकते हैं।

     var obj = new Object("foo"); typeof obj // "object" obj === "foo" // true obj.a = 1; obj === "foo" // true obj.a // 1 var str = "foo"; str.a = 1; str.a // undefined 

वास्तव में, जावास्क्रिप्ट में ऑब्जेक्ट बनाने के कई तरीके हैं। जब आप केवल एक ऑब्जेक्ट बनाना चाहते हैं, तो " नया " ऑपरेटर का उपयोग करके " कन्स्ट्रक्टर-आधारित " ऑब्जेक्ट बनाने का कोई फायदा नहीं है। यह " ऑब्जेक्ट शाब्दिक " वाक्यविन्यास का उपयोग कर एक वस्तु बनाने के समान है लेकिन जब आप " प्रोटोटाइप इनहेरिटेंस " के बारे में सोच रहे हैं तो " नया " ऑपरेटर के साथ बनाया गया " कन्स्ट्रक्टर-आधारित " ऑब्जेक्ट अविश्वसनीय उपयोग के लिए आता है आप वर्चुअल श्रृंखला को शाब्दिक वाक्यविन्यास के साथ बनाए गए वस्तुओं के साथ नहीं रख सकते। लेकिन आप एक कन्स्ट्रक्टर फ़ंक्शन बना सकते हैं, इसके प्रोटोटाइप के गुण और तरीके जोड़ सकते हैं। फिर यदि आप " नया " ऑपरेटर का उपयोग कर किसी भी चर के लिए इस कंसट्रक्टर फ़ंक्शन को असाइन करते हैं, तो वह उस ऑब्जेक्ट को वापस करेगा जो कि कन्स्ट्रक्टर फ़ंक्शन के प्रोटोटाइप से जुड़ी सभी तरीकों और गुणों तक पहुंच जाएगा।

यहां कंस्ट्रक्टर फ़ंक्शन का उपयोग करते हुए एक ऑब्जेक्ट बनाने का एक उदाहरण है (नीचे दिए गए कोड स्पष्टीकरण देखें):

 function Person(firstname, lastname) { this.firstname = firstname; this.lastname = lastname; } Person.prototype.fullname = function() { console.log(this.firstname + ' ' + this.lastname); } var zubaer = new Person('Zubaer', 'Ahammed'); var john = new Person('John', 'Doe'); zubaer.fullname(); john.fullname(); 

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

ध्यान दें: " यह " कीवर्ड कंसट्रक्टर फ़ंक्शन के भीतर एक रिक्त ऑब्जेक्ट को संदर्भित करेगा और जब भी आप " नया " ऑपरेटर का इस्तेमाल करते हुए व्यक्ति से एक नया ऑब्जेक्ट बनाते हैं, तो यह स्वचालित रूप से " यह " खोजशब्द । और ये ऑब्जेक्ट पर्सन कन्स्ट्रक्टर फ़ंक्शन के प्रोटोटाइप से जुड़ी विधियों और गुणों को सुनिश्चित करने के लिए निश्चित होगा (जो इस दृष्टिकोण का मुख्य लाभ है)।

वैसे, यदि आप " ऑब्जेक्ट वर्टिकल " वाक्यविन्यास के साथ एक ही कार्यक्षमता प्राप्त करना चाहते हैं, तो आपको नीचे दिए गए सभी ऑब्जेक्टों पर पूर्णनाम () बनाना होगा:

 var zubaer = { firstname: 'Zubaer', lastname: 'Ahammed', fullname: function() { console.log(this.firstname + ' ' + this.lastname); } }; var john= { firstname: 'John', lastname: 'Doe', fullname: function() { console.log(this.firstname + ' ' + this.lastname); } }; zubaer.fullname(); john.fullname(); 

आखिरकार, यदि आप अब पूछते हैं कि मुझे ऑब्जेक्ट शाब्दिक दृष्टिकोण के बजाय कंस्ट्रक्टर फ़ंक्शन दृष्टिकोण का उपयोग क्यों करना चाहिए:

*** प्रोटोटाइप विरासत विरासत की एक सरल श्रृंखला की अनुमति देता है जो बेहद उपयोगी और शक्तिशाली हो सकता है।

*** यह आम विधियों और गुणक गुणों को संरक्षित करने के लिए स्मृति प्रोटोकॉल में संरक्षित करता है। अन्यथा, आपको उन्हें सभी वस्तुओं में बार-बार प्रतिलिपि करना होगा

मुझे लगता है कि इसका मतलब बनता है।

इसके अलावा, ओरेली जावास्क्रिप्ट पुस्तकों में से कुछ के अनुसार …. (उद्धृत)

ऑब्जेक्ट कन्स्ट्रक्टर के विरोध में लीटरल्स का उपयोग करने का दूसरा कारण यह है कि कोई स्कोप रिज़ॉल्यूशन नहीं है क्योंकि यह संभव है कि आपने एक ही नाम के साथ एक स्थानीय कन्स्ट्रक्टर बनाया है, दुभाषिया को ऑब्जेक्ट () को जब तक इसे वैश्विक ऑब्जेक्ट कन्स्ट्रक्टर नहीं मिल जाता है, उस स्थान से दायरा श्रृंखला को देखने की जरूरत है

ईएस 6 / ईएस2015 के लिए मुझे एक अंतर मिल गया है जब तक आप ऑब्जेक्ट को new Object() साथ चारों ओर नहीं लेते, आप लघुकोड एरो फ़ंक्शन सिंटैक्स का उपयोग करके कोई ऑब्जेक्ट नहीं लौटा सकते।

 > [1, 2, 3].map(v => {n: v}); [ undefined, undefined, undefined ] > [1, 2, 3].map(v => new Object({n: v})); [ { n: 1 }, { n: 2 }, { n: 3 } ] 

इसका कारण यह है कि कंपाइलर को {} ब्रैकेट्स द्वारा भ्रमित किया गया है और सोचता है कि n: i एक लेबल है: कथन निर्माण; अर्धविराम वैकल्पिक है इसलिए इसके बारे में शिकायत नहीं करता है

यदि आप ऑब्जेक्ट में दूसरी प्रॉपर्टी जोड़ते हैं तो यह अंततः एक त्रुटि फेंकता है

 $ node -e "[1, 2, 3].map(v => {n: v, m: v+1});" [1, 2, 3].map(v => {n: v, m: v+1}); ^ SyntaxError: Unexpected token : 

मेमोरी उपयोग अलग है यदि आप 10 हजार उदाहरण बनाते हैं नया ऑब्जेक्ट () केवल एक ही कॉपी रखेगा जबकि {} 10 हजार प्रतियां रखेगा।