2010-04-16 14 views
7

मैं जावास्क्रिप्ट में उन्मुख प्रोग्रामिंग ऑब्जेक्ट करने के लिए अपेक्षाकृत नौसिखिया हूं, और मुझे जावास्क्रिप्ट में ऑब्जेक्ट्स को परिभाषित करने और उपयोग करने के "सर्वोत्तम" तरीके से अनिश्चितता है। मैंने वस्तुओं को परिभाषित करने के लिए "कैननिकल" तरीका देखा है और नीचे दिखाए गए अनुसार एक नया उदाहरण तत्काल स्थापित किया है।जावास्क्रिप्ट में नए ऑब्जेक्ट्स बनाना

function myObjectType(property1, propterty2) { 
    this.property1 = property1, 
    this.property2 = property2 
} 
// now create a new instance 
var myNewvariable = new myObjectType('value for property1', 'value for property2'); 

लेकिन मैं अन्य तरीकों से इस तरह से वस्तुओं के नए उदाहरण बना करने के लिए देखा है:

var anotherVariable = new someObjectType({ 
    property1: "Some value for this named property", 
    property2: "This is the value for property 2" 
}); 

मैं कैसे है कि दूसरा तरीका प्रतीत होता है की तरह है - कोड स्वयं कुछ दस्तावेज़ीकृत है। लेकिन मेरे प्रश्न हैं:

  1. किस तरह से "बेहतर" है?

  2. मैं उपयोग कर सकते हैं कि को दूसरी तरह से एक वस्तु प्रकार है कि कि निहित निर्माता के साथ ऑब्जेक्ट प्रकार को परिभाषित करने के "शास्त्रीय" जिस तरह का उपयोग कर परिभाषित किया गया है के एक चर का दृष्टांत?

  3. यदि मैं इन ऑब्जेक्ट्स की एक सरणी बनाना चाहता हूं, तो क्या कोई अन्य विचार हैं?

अग्रिम धन्यवाद।

+2

कुछ दिनों पहले इस बारे में एक अच्छा धागा था। http://stackoverflow.com/questions/1595611/how-to-properly-create-a-custom-object-in-javascript – lincolnk

+0

सम्मेलन द्वारा यह अनुशंसा की जाती है कि "ऑब्जेक्ट" कार्यों का पहला अक्षर पूंजीकृत हो। – Sydwell

उत्तर

7

यह वास्तव में स्वाद के लिए नीचे है। इस तरह:

var anotherVariable = new someObjectType({ 
    property1: "Some value for this named property", 
    property2: "This is the value for property 2" 
}); 

... हो, तो एक से अधिक 2/3 तर्क, के रूप में यह पठनीयता एड्स और यह आसान वैकल्पिक तर्क समस्या (fn(null,null,null,123')) से बचने के लिए बनाता है आम तौर पर बेहतर है।

एक और विचार प्रदर्शन है।परंपरागत तरीके से तर्क पार करना तेजी से होगा, लेकिन यह गति लाभ केवल प्रदर्शन-संवेदनशील परिस्थितियों में महत्वपूर्ण हो जाता है।

मैं उपयोग कर सकते हैं दूसरा तरीका एक वस्तु प्रकार है कि कि निहित निर्माता के साथ ऑब्जेक्ट प्रकार को परिभाषित करने के "शास्त्रीय" जिस तरह का उपयोग कर परिभाषित किया गया है के एक चर का दृष्टांत है कि?

आसानी से नहीं। आप एक हैश का उपयोग कर के बजाय सिर्फ तर्क गुजर, और आप स्रोत पर नियंत्रण नहीं है द्वारा एक निर्माता का दृष्टांत चाहते हैं, तो आप "रैप" कर सकता है यह:

var _constructor = SomeConstructorFunction; 

SomeConstructorFunction = function(hash) { 
    return new _constructor(hash.property1, hash.property2); 
}; 

मैं वास्तव में खिलवाड़ की सिफारिश नहीं होगा हालांकि शैली के लिए सिर्फ तीसरे पक्ष के एपीआई के साथ।

यदि मैं इन वस्तुओं की एक सरणी बनाना चाहता हूं, तो क्या कोई अन्य विचार हैं?

सरणी कितनी बड़ी है? वास्तव में सरणी क्या है? प्रदर्शन पर विचार के लायक हो सकता है ...

1

ठीक है, दूसरा तरीका अच्छा लगता है और "कक्षा" के मामले में उपयोगी है जिसमें कई सेटअप विकल्प हैं। हालांकि, ध्यान रखें कि आप वास्तव में प्रक्रिया में एक और वस्तु का निर्माण कर रहे हैं।

मैं आपको एक या एक अन्य जावास्क्रिप्ट ढांचे से कुछ कोड पढ़ने और आपको एक अपील करने वाली शैली ढूंढने की सलाह दूंगा।

1

1) मैं कहूंगा कि विधि # 2 मेरे लिए वैसे भी बहुत पसंद है। 2 गुणों के साथ उदाहरण है कि अलग नहीं है, लेकिन क्या हुआ अगर आप ऐसा करना चाहता था:

var anotherVariable = new someObjectType({ 
    property1: "Some value for this named property", 
    property2: "This is the value for property 2" 
    //Leaving several properties out, don't want them populated 
    property8: "This is the value for property 8" 
    property9: "This is the value for property 9" 

}); 

के बारे में आप कितने भार के (या null रों का ट्रैक रखने) के संयोजन होगा सोचो गुण संभाल करने के लिए आप ऑब्जेक्ट को पहली विधि के साथ आपूर्ति करना चाहते हैं या नहीं भी कर सकते हैं। यह बहुत अधिक विस्तारणीय और लचीला दृष्टिकोण है।

2) बस इसे एक खाली कन्स्ट्रक्टर के साथ अनुमति दें, यह तत्काल के लिए बहुत साफ होगा।

3) लंबाई/पठनीयता, विशेष रूप से कुछ वस्तुओं से अधिक के साथ। JSON को देखो, यह बहुत कम साफ/पठनीय है, फिर से कम से कम मेरे लिए, यदि आपको वह शैली पसंद है, तो आपकी ऑब्जेक्ट्स के सरणी बनाने से बहुत विधि # 2 में समान दिखता है।

3

जावास्क्रिप्ट वस्तुओं को बनाने का सबसे अच्छा तरीका Javascript: The Good Parts के नए (कम से कम अगर आप Crockford शिविर की सदस्यता)

myObjectType = function(props) { 
    // anything defined on props will be private due to the closure 

    props.privateVar = "private"; 

    // anything defined on obj will be public 
    obj = {}; 

    obj.testing = new function() { 
    alert(props.privateVar); 
    }; 

    return obj; 
}; 
instance = myObjectType({prop1: "prop"}); 

// if we want inheritance, it just means starting with the base type instead of 
// a new object 
subType = function(props) { 
    obj = myObjectType(props); 
    obj.subTypeProperty = "hello."; 

    return obj; 
}; 

पृष्ठ 52 का उपयोग कर छोड़ दिया है, मैं अत्यधिक यह सलाह देते हैं: -)

+0

गह! 'नया फ़ंक्शन() {...} 'पूरी तरह गलत है! फैक्ट्री/बिल्डर फ़ंक्शन का उपयोग करना ठीक और अच्छा है, लेकिन 'नया फ़ंक्शन ...' बहुत गलत है। –

+1

@ सेनएमसीमिलन कह रहा है कि यह गलत है जब आप तर्क लाते हैं :) –

+2

@ गोटो: मेला। 'नया फ़ंक्शन() {...} 'अज्ञात फ़ंक्शन के प्रोटोटाइप से व्युत्पन्न एक नई वस्तु बनाएगा, और इसे प्रारंभ करने के लिए अनाम फ़ंक्शन का उपयोग करेगा। आप उस ऑब्जेक्ट को तत्काल समाप्त कर देते हैं जिसकी आपको आवश्यकता नहीं है। यह ईमानदारी से मेरे लिए एक टाइपो की तरह दिखता है। किसी भी तरह से, 'obj.testing' एक ऑब्जेक्ट होगा, फ़ंक्शन नहीं, और अलर्ट सृजन पर चलाएगा, एक विधि के रूप में नहीं। एक नया ऑब्जेक्ट ('{}') असाइन करने के साथ 'नया' अज्ञात फ़ंक्शन को तत्काल अनावश्यक करना पूरी तरह से अनावश्यक है। –

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