`नई वस्तु ()` और वस्तु शाब्दिक अंकन के बीच अंतर क्या है?


199

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

person = new Object()

... और यह शाब्दिक वाक्य रचना:

person = {
    property1 : "Hello"
};

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

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


7
एक ही सभी: a = new Object, a = new Object(), a = {}, शाब्दिक बहुत सरल है और थोड़ी देर पहले का कहना है कि यह तेजी से, नए compilers मेरे बयान गलत का कारण हो सकता है कुछ परीक्षण मैं एक भाग गया। वही शाब्दिक सरणियों पर लागू होता है
जुआन मेंडेस

8
उम्मीद है कि आप varवैश्विक नाम स्थान को प्रदूषित होने से बचाने के लिए अपने चर में कीवर्ड के साथ अपने चर घोषित कर रहे हैं और अपने चर के लिए स्टैक में वर्तमान रिकॉर्ड से परे देखने की आवश्यकता पैदा कर रहे हैं।
समो

1
मूल रूप से, किसी कार्यक्रम के निष्पादन के दौरान किसी भी बिंदु पर रिकॉर्ड या ब्लॉक का ढेर होता है। प्रत्येक रिकॉर्ड में चर की एक सूची है जो उस दायरे में बनाई गई थी। जावास्क्रिप्ट में, अगर किसी अभिव्यक्ति में एक चर है और दुभाषिया उसे उस दायरे के लिए स्टैक रिकॉर्ड में नहीं पा सकता है, तो वह अगले रिकॉर्ड तक चलता रहेगा जब तक कि वह चर नहीं पाता। अधिक जानकारी davidshariff.com/blog/...
Samo

2
JSLint से बचना एक अच्छा डेवलपर बनने का पहला कदम है। का उपयोग करना newएक सम्मेलन है जो एक औसत दर्जे की भाषा के व्यर्थ नाइटपैकिंग को पार करता है। उपयोग करें newक्योंकि इसका अर्थ स्पष्ट है। 99.9% मामले में, प्रदर्शन लाभ अप्रासंगिक हैं।
हैल 50000

1
@ Hal50000 औसत दर्जे की भाषा किसके अनुसार है?
Xam

जवाबों:


124

वे दोनों एक ही काम करते हैं (जब तक कि किसी ने कुछ असामान्य नहीं किया है), इसके अलावा आपका दूसरा एक ऑब्जेक्ट बनाता है और इसमें एक संपत्ति जोड़ता है। लेकिन स्रोत कोड में शाब्दिक अंकन कम जगह लेता है। यह स्पष्ट रूप से पहचानने योग्य है कि क्या हो रहा है, इसलिए उपयोग करते हुए 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बजाय उपयोग करने का कोई कारण नहीं है {}(जब तक कि आपने बहुत असामान्य बात नहीं की है)।


11
लेखक ने इस उत्तर को सही चुना, लेकिन यह अधूरा है। याद रखें कि जब आप मेमोरी आवंटन में आते हैं तो दो सिंटैक्स के बीच अंतर होता है।
newshorts

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

FYI करना भी () new Object()आवश्यक नहीं है। (आवश्यक बात नहीं के बारे में बात कर रहे हैं)
रॉय नामी

मुझे लगता है कि हमें वर्तमान विनिर्देश के रूप में नए का उपयोग करने की आवश्यकता नहीं है । मुझे अपने विचार बताएं @kevin
वामसी पावन महेश

1
यदि आप एक ऐसी वस्तु चाहते हैं जो विरासत में मिली श्रृंखला से विरासत में न मिले तो आप ऑब्जेक्ट बना और पास कर सकते हैं। वे समान नहीं हैं और क्रमशः उपयोगी उद्देश्य हैं।
आरोन

234

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

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

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अपनी वस्तुओं के प्रत्येक उदाहरण के भीतर विधि की एक प्रति ले जाते हैं। जबकि, प्रोटोटाइप तरीके के साथ, विधि को ऑब्जेक्ट प्रोटोटाइप में परिभाषित किया गया है और सभी ऑब्जेक्ट इंस्टेंस के बीच साझा किया गया है। यदि आपके पास बहुत सी वस्तुएं या बहुत सारी विधियां हैं, तो शाब्दिक तरीका काफी बड़ी मेमोरी बर्बाद कर सकता है।


39
मेरे लिए सवाल खाली वस्तुओं को बनाने के लिए new Object()बनाम {}का उपयोग करने के बीच अंतर के बारे में अधिक था ।
पीटर

11
@ लॉबोब आसिड के पहले वाक्य से, यह उत्तर वास्तव में ओपी के प्रश्न के बारे में कोई जानकारी प्रदान नहीं करता है। इसमें कहीं भी 'नई वस्तु' () नहीं है। सच कहूँ तो, मुझे लगता है कि श्री डेविड ने प्रश्न को गलत समझा।
JLRishe 15

17
जब मैंने इसे पोस्ट किया तो स्वीकृत उत्तर पहले से ही था और स्वीकार किया गया था। और यह पूरी तरह से ओपी सवाल का जवाब देता है इसलिए मैं वही बात दोहराने नहीं जा रहा था। मैंने अपना उत्तर मुख्य रूप से खाली / सरल वस्तुओं से परे विषय को व्यापक बनाने के लिए पोस्ट किया। किस मामले में एक महत्वपूर्ण अंतर है जो ध्यान देने योग्य है।
रेमी डेविड

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

3
मैं इस जवाब के लिए आया था, एक सवाल पर आधारित था जो मेरे जैसा था, लेकिन सीखने के लिए मुझे वही चाहिए जो मुझे जानना चाहिए था। धन्यवाद।
पैट मिगलियाकियो

55

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

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"};  

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

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

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

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


1
कैसे के बारे में Object.Create? देखें: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
फिल

यदि आप new Object()इस संभावना के कारण वस्तु शाब्दिक के पक्ष में जा रहे हैं कि कुछ वस्तु समारोह से आगे निकल गई है, तो आपको पूरे स्थान पर गार्ड भी लिखना चाहिए जब आप सहायकों का उपयोग करते हैं, Object.keysतो सुनिश्चित करें कि यह अपरिभाषित नहीं है, जो अनुपस्थिति में उतरता है। मैं हमेशा लोगों को शाब्दिक संकेतन का उपयोग करने की सलाह दूंगा, लेकिन मुझे लगता है कि यह विशेष तर्क अलग हो जाता है जब आप इस तरह से सोचने के परिणामों के बारे में सोचते हैं।
फराज

41

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');

ध्यान दें, यह यहाँ पाया गया है का एक विस्तार है: क्यों गिरफ्तारी है = [] गिरफ्तारी की तुलना में तेज = नया ऐरे?

मेरा आउटपुट निम्नलिखित था:

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

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


3
मुझे ऐसा लगता है कि यह उत्तर है कि प्रश्न वास्तव में तलाश कर रहा था, हालांकि मैं यह सुनिश्चित करना चाहूंगा कि किसी वस्तु पर इसके अतिरिक्त परीक्षण किए जाएं ताकि कुछ गुणों के साथ यह सुनिश्चित हो सके।
संडेमन जूल

2
दिलचस्प संख्या। ऐसे लोग हैं जिन्हें इसके बारे में पता होना चाहिए, लेकिन मैं दूर ले जाता हूं कि 200,000 वस्तुओं को भी आवंटित करना मेरे लिए केवल 5.6ms की लागत है, इसलिए मैं इसके बारे में चिंता करने वाला नहीं हूं।

Node 10.13.0 चीजों पर परीक्षण की गई है: []: 117.178ms नए का उपयोग करते हुए: 116.947ms परीक्षण वस्तु: {}: 116.252ms नए का उपयोग करते हुए: 115.910ms
PirateApp

31

यहां हर कोई दोनों की समानता के बारे में बात कर रहा है। मैं मतभेदों को इंगित करने वाला हूं।

  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

3
मैं अंतिम दो पंक्तियों के बारे में बहुत उलझन में हूँ .. यदि आप str.a मान 1 पर असाइन करते हैं, तो str.a को अपरिभाषित किया जाता है? .. @Jermin Bazazin
Andrea Scarafoni

3
@AndreaScarafoni इसलिए strकि stringआप टाइप कर रहे हैं ताकि आप उस पर कोई प्रॉपर्टी न दे सकें। jsfiddle.net/grq6hdx7/1
क्रिस बिएर

1
4 का जवाब बदल गया है? मुझे नवीनतम क्रोम 53var obj = new Object("foo"); typeof obj; obj === "foo" // true
विलियम हिल्टन

21

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

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

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();

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

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

वैसे, यदि आप " ऑब्जेक्ट शाब्दिक " सिंटैक्स के साथ समान कार्यक्षमता प्राप्त करना चाहते थे, तो आपको नीचे दिए गए सभी ऑब्जेक्ट्स पर 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();

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

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

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

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


धन्यवाद! ऑब्जेक्ट शाब्दिक में लापता "यह" जोड़ने के लिए कार्ल। यह एक भयानक गलती थी। मुझे इस प्रकार की गलती नहीं करनी चाहिए थी।
मु। जुबैर अहमद

"आप शाब्दिक वाक्य रचना के साथ बनाई गई वस्तु से विरासत में नहीं मिल सकते।" - सच नहीं (मुझे विश्वास है)। आप आवश्यकतानुसार इनहेरिटेंस चेन का उपयोग Object.create(<object defined using literal notation>)या new Object(<object defined using literal notation>)निर्माण कर सकते हैं ।
बालाजेकर

@balajeerc आपकी टिप्पणी के लिए धन्यवाद। वास्तव में यह "आप शाब्दिक वाक्य रचना के साथ बनाई गई वस्तुओं के साथ विरासत श्रृंखला को बनाए नहीं रख सकते हैं" होना चाहिए। कई चरणों में उत्तर देने वाला: 1. Object.create (): हां, एक ऑब्जेक्ट शाब्दिक रूप से इसे पास करना संभव है और यह एक नई वस्तु लौटाएगा, जो प्रोटोटाइप उस वस्तु शाब्दिक पारित कर देगा। लेकिन यह नहीं पता है कि यह निर्माण कार्य क्या है या उस वस्तु शाब्दिक को याद नहीं है जिसमें से इसे बनाया गया था। तो, testobj1.constructor एक खाली फ़ंक्शन लौटाएगा और माता-पिता / पूर्वज के रूप में उस वस्तु शाब्दिक गुणों / विधियों को जोड़ने का कोई तरीका नहीं होगा।
मु। जुबेर अहमद

@balajeerc 2. नई वस्तु (): इस मामले में लगभग एक ही बात होती है। इसके अलावा, यह बुरा है अगर आप स्मृति के बारे में सोचते हैं। इसके गुणों और विधियों को प्रोटोटाइप में डालने के बजाय, यह पारित ऑब्जेक्ट शाब्दिक से सब कुछ कॉपी करता है और इसे लौटी हुई वस्तु में डालता है। यह स्मृति के लिए अच्छा नहीं है। दूसरी ओर, मैंने एक कंस्ट्रक्टर फ़ंक्शन के साथ सच्ची विरासत श्रृंखला पर ध्यान केंद्रित किया, जहां आप मक्खी पर विधियों और गुणों को संपादित कर सकते हैं और निर्माण विधि का उपयोग करके बनाई गई अन्य वस्तुएं भी प्रभावित होती हैं क्योंकि वे केवल उस निर्माण कार्य की ओर इशारा करते हैं (बजाय उनकी नकल करने के) ।
मो। ज़ुबेर अहमद

@balajeerc उदाहरण: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(); // Zubaer Ahammed john.fullname(); // John Doe zubaer.constructor.prototype.fullname = function() { console.log( 'Hello ' + this.firstname); } zubaer.fullname(); // Hello Zubaer john.fullname(); // Hoello John
Md। जुबेर अहमद

9

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

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


24
प्रतीक्षा ओ'रेली एक टाइपो या एक जानबूझकर सजा थी? उन्हें अपनी पुस्तकों के विपणन के लिए इसका उपयोग करना चाहिए!
टिम ओगिल्वी

3

मुझे एक अंतर मिला है, ES6 / ES2015 के लिए। आप शॉर्टहैंड एरो फ़ंक्शन सिंटैक्स का उपयोग करके किसी ऑब्जेक्ट को वापस नहीं कर सकते, जब तक कि आप ऑब्जेक्ट को चारों ओर से घेरे नहीं 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 :

4
आप अभी भी एक तीर फ़ंक्शन का उपयोग कर सकते हैं, आपको बस अधिक ब्रेसिज़ और एक वापसी की आवश्यकता है: [1, 2, 3].map(v => { return {n: v}; });आप एक ही चीज़ को शुद्ध करेंगे ...
हेट्रिक बंदर

बेशक आप नियमित रूप से तीर कार्यों का उपयोग कर सकते हैं, मैं क्या बारे में बात कर रहा था आशुलिपि संस्करण, यानी था param => return_value, और का उपयोग कर के बीच अंतर {}और new Object()इस मामले में।
आंद्रेई सिमियोनेस्कु

11
आप अभी भी शॉर्टहैंड संस्करण और नियमित तीर फ़ंक्शंस का उपयोग कर सकते हैं। बस कोष्ठक की एक जोड़ी के साथ {n: v} लपेटें:[1, 2, 3].map(v => ({n: v}));
स्टीफन C

1

2019 अपडेट

मैंने अपने OSX हाई सिएरा 10.13.6 नोड संस्करण 10.13.0 पर @rjloura के समान कोड चलाया और ये परिणाम हैं

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');


Testing Array:
using[]: 117.613ms
using new: 117.168ms
Testing Object:
using{}: 117.205ms
using new: 118.644ms

-2

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


7
newएक नई वस्तु बनाता है। वे दोनों समान मात्रा में मेमोरी लेते हैं।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.