2009-08-08 16 views
10

कोड 1:इन दो कोड नमूने के बीच क्या अंतर है?

var Something = { 
name: "Name", 
    sayHi: function(){ 
    alert(Something.name); 
    } 
} 

कोड 2:

function Something(){ 
    this.name = "Name"; 
} 

Something.prototype.sayHi = function(){ 
    alert(Something.name); 
} 

संपादित करें: तो, दोस्तों, क्या आपका मतलब है दूसरा एक बेहतर है? या अधिक "औपचारिक"?

+0

यह भी मेरे लिए एक अच्छा सवाल, पोस्टिंग के लिए धन्यवाद है। –

+0

संपादन में आपके प्रश्न के संबंध में, यह इस बात पर निर्भर करता है कि आप क्या करना चाहते हैं। यदि आपके पास ऑब्जेक्ट की केवल एक प्रति है, तो पहले वाक्यविन्यास के लिए जाएं। यदि कई प्रतियां बनाना चाहते हैं (जैसे कि 'कुछ' अन्य भाषाओं में 'कक्षा' थी), तो दूसरे वाक्यविन्यास (या वास्तव में, एक संपादित संस्करण के लिए जाएं जिसमें आप 'this.sayHi = फ़ंक्शन() {...} ', यह मानक है)। –

उत्तर

8

असल में क्या करना है आप

Something.sayHi(); 

कर सकते हैं:

आप शायद कहना है कि लाइन चाहता था पहले उदाहरण में आप object literal घोषित करते हैं जो वास्तव में पहले से ही एक ऑब्जेक्ट उदाहरण है।

अपने दूसरे उदाहरण में, आप एक कन्स्ट्रक्टर फ़ंक्शन को परिभाषित करते हैं जिसका उपयोग ऑब्जेक्ट इंस्टेंस बनाने के लिए new ऑपरेटर के साथ किया जा सकता है।

वस्तुओं के नए उदाहरण बनाने और प्रोटोटाइप विरासत करने के लिए ऑब्जेक्ट अक्षरों का भी उपयोग किया जा सकता है, डगलस क्रॉकफ़ोर्ड भी इस तकनीक को बढ़ावा देता है।

function object(o) { 
    function F() {} 
    F.prototype = o; 
    return new F(); 
} 

यह सहायक समारोह एक बहुत ही सहज और सुविधाजनक तरीके से इस्तेमाल किया जा सकता:

मूल रूप से आप एक object ऑपरेटर हो सकता है।

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

यह इस तरह इस्तेमाल किया जा सकता:

var oldObject = { 
    firstMethod: function() { alert('first'); }, 
    secondMethod: function() { alert('second'); }, 
}; 

var newObject = object(oldObject); 
newObject.thirdMethod = function() { alert('third'); }; 

var otherObject = object(newObject); 
otherObject.firstMethod(); 

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

अनुशंसित:

+0

'ऑब्जेक्ट (कुछ)' का उपयोग करना 'नया' कीवर्ड का उपयोग करने जैसा नहीं है। विशेष रूप से, यदि आप पहले मामले में कोई भी संपत्ति बदलते हैं, तो यह वैश्विक रूप से बदल जाएगा। उदाहरण के लिए 'ऑब्जेक्ट (कुछ) .name = "नया नाम" 'इसे कुछ के लिए बदलता है, जबकि' (नया कुछ())। नाम =" नया नाम "' केवल उस विशेष _instance_ के लिए इसे बदलता है। –

+0

हां, क्षमा करें मैं इस लेख में वर्णित 'ऑब्जेक्ट' ऑपरेटर के बारे में सोच रहा था ... http://javascript.crockford.com/prototypal.html – CMS

+0

@Sinan, भारी संपादित ... 24 घंटों में सोया नहीं है: -) ... – CMS

7

में पहले कोड स्निपेट, Something एक साधारण वस्तु है, न कि एक निर्माता। विशेष रूप से, आप फोन नहीं कर सकते हैं:

var o = new Something(); 

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

दूसरा स्निपेट में, Something एक निर्माता है, और आप इसके साथ new कीवर्ड का उपयोग कर सकते हैं।

संपादित करें:

इसके अलावा, अपने दूसरे स्निपेट में, जब से तुम Something.name उपयोग कर रहे हैं के रूप में this.name करने का विरोध किया है, यह हमेशा निर्माता ही है, जो "समथिंग" है का नाम है, सूचित करेंगे जब तक आप Something.name = "Cool"; जैसे कुछ के साथ उस संपत्ति को ओवरराइड करें।

alert(this.name); 
1

पहले उदाहरण में, जबकि दूसरा एक में आप इसे

new Something().sayHi(); 
संबंधित मुद्दे