2016-09-09 4 views
5

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

उदाहरण:

window.fooModule = { 

    init: function() { 
    this.bar = "cee";  
    doStuff(); 
    }, 

    doStuff: function() { 
    ... 
    } 
} 

window.fooModule.init(); 

Example2:

window.fooModule = new function(){ 
    this.bar = "Cee"; 

    this.doStuff = function() { 
    ... 
    } 


    this.doStuff(); 
} 
+1

दूसरा एक [बिल्कुल भयानक है] (http://stackoverflow.com/q/10406552/1048572) और कभी नहीं – Bergi

+0

कि मूर्ख है हटा दिया झंडा, पर ले जाने के लिए प्रयोग किया जाता जाना चाहिए ओह,,! – Roberrrt

+0

अंतर यह है कि पहले में 'doStuff() 'नाम त्रुटि के साथ विफल हो जाएगा। – deceze

उत्तर

1

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

निष्कर्ष

उपयोग दूसरे अंकन यदि आपका वस्तु कुछ कोड जब बनाई गई है कॉल करने के लिए है, पहले नहीं तो का उपयोग करें।

दूसरा अंकन के बारे में अधिक

दूसरा टिप्पणी को स्थानीय (निजी) चर और निर्माता के अंदर कार्यों का उपयोग कर, क्योंकि निर्माता हमें खुद गुंजाइश देने में सक्षम बनाता है। निर्माता और new साथ

var obj=new function(){ 

    var priv="Local scope variable"; 

    var method=function(){ 

    console.log("Local method"); 
    }; 

    this.doStuff=function(){ 

    //here local methods and variables can be used 
    }; 
}; 

दूसरा अंकन अधिक बार मानक निर्माता समारोह घोषणा और प्रोटोटाइप घोषणा के साथ प्रयोग किया जाता है। यदि हमें एक वस्तु को और अधिक बनाने की आवश्यकता है तो यह सही तरीका है। प्रोटोटाइप में नहीं बल्कि कन्स्ट्रक्टर में विधियों और प्रत्येक साझा गुणों को घोषित किया जाना चाहिए।

var ExampleClass=function(bar){ 

    //constructor 
    this.bar = bar; 
}; 

ExampleClass.prototype.doStuff=function(){ 

}; 

बनाना ऐसी वस्तु:

var a=new ExampleClass("A bar"); //a.bar is "A bar" 
var b=new ExampleClass("B bar"); //b.bar is "B bar" 

वस्तुओं a और b ही प्रोटोटाइप है (यह स्मृति बचाता है) लेकिन वे विभिन्न गुणों निर्माता में सेट कर सकते हैं।

OffTop

जावास्क्रिप्ट में, इतने सारे संभावनाओं वस्तुओं बनाने के लिए है मैं तीसरा उदाहरण कैसे पहले अंकन में रन कोड है:

window.fooModule = { 

    init: function() { 
    this.bar = "cee";  
    this.doStuff(); 

    return this;//return this 
    }, 

    doStuff: function() { 

    } 
}.init();//run init after object notation 

मैं वस्तु बना सकते हैं और एक बार में init चलाते हैं।

+0

आपका मूल्यांकन सही है, लेकिन मैं आपके निष्कर्ष से असहमत हूं। किसी को ** दूसरे नोटेशन का कभी भी उपयोग नहीं करना चाहिए **। यदि आपको सृजन के दौरान कुछ कोड निष्पादित करने की आवश्यकता है, तो IIFE (जैसे मॉड्यूल पैटर्न में) का उपयोग करें। – Bergi

+0

@ बर्गि मैंने कुछ और सूचनाएं –

+0

धन्यवाद, लेकिन मेरा मुद्दा यह है कि 'नया' केवल तभी उपयोग किया जाना चाहिए जब कई उदाहरण बनाए जाए, और कभी भी एक ऑब्जेक्ट के लिए न हो, भले ही कोड निष्पादित किया जाए। – Bergi

-1

1 उदाहरण obj1 लौट जाने और 2 उदाहरण लौट obj2

obj1 [[प्रोटोटाइप]] एक वस्तु है होगा। इस ऑब्जेक्ट में कन्स्ट्रक्टर प्रॉपर्टी है "फ़ंक्शन ऑब्जेक्ट()"

obj2 [[प्रोटोटाइप]] एक ऑब्जेक्ट होगा।इस ऑब्जेक्ट में कन्स्ट्रक्टर प्रॉपर्टी अज्ञात फ़ंक्शन है।

2 उदाहरण में जिस तरह से आम तौर पर हम कुछ "सिंगलटन" कॉल प्राप्त करने के लिए प्रयोग किया जाता है

बोनस: इस सामान उलझन में करने के लिए आसान है, लेकिन अगर आप विस्तार में जाकर करना चाहते हैं, यहाँ आप

के लिए एक अच्छा पोस्ट है

https://zeekat.nl/articles/constructors-considered-mildly-confusing.html

+1

पहला पैटर्न एक सिंगलटन ऑब्जेक्ट भी बनाता है। – Bergi

+0

"* [[प्रोटोटाइप]] का क्या मतलब है एक वस्तु *"? और क्या आप सुझाव दे रहे हैं कि परिणाम वास्तव में अलग नहीं हैं? जावास्क्रिप्ट पर – Bergi

+0

, आप वस्तु के प्रोटोटाइप तक पहुंच को प्रत्यक्ष नहीं कर सकते हैं। हालांकि, आप किसी फ़ंक्शन के प्रोटोटाइप तक पहुंच सकते हैं। [[प्रोटोटाइप] जिस तरह से मैं उस ऑब्जेक्ट के अनावश्यक प्रोटोटाइप का उल्लेख करने के लिए उपयोग करता हूं और फ़ंक्शन के सुलभ प्रोटोटाइप – Khoa

-1

वस्तुओं रहे हैं और वस्तु परिभाषाओं प्रोटोटाइप देखते हैं। आपके उदाहरणों में से कोई भी ऑब्जेक्ट परिभाषा प्रोटोटाइप हैं।

window.fooModule = function(bar){ 
    this.bar = bar; 

    (this.doStuff = something => { 
    console.log(this.bar,'is doing', something || 'something'); 
    })(); 
}; 

[a,b]= [new fooModule('a'), new fooModule('b')]; 

आप बस एक वस्तु बनाने के लिए चाहते हैं, तो आप new और this ऑपरेटर छोड़ सकते हैं।

(window.fooModule = { 
    bar : 'Cee', 
    doStuff : something => { 
    console.log(foo.bar,'is doing', something || 'something'); 
    }}).doStuff(); 
+0

तब "ऑब्जेक्ट परिभाषा" क्या होगी? – Bergi

+0

ऑब्जेक्ट प्रोटोटाइप। –

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