2011-07-27 12 views
144

अब तक मैंने जावास्क्रिप्ट में ऑब्जेक्ट बनाने के तीन तरीके देखे हैं, ऑब्जेक्ट बनाने के लिए सबसे अच्छा तरीका क्यों है और क्यों?जावास्क्रिप्ट में ऑब्जेक्ट बनाने के लिए सबसे अच्छा तरीका कौन सा है? ऑब्जेक्ट के चर से पहले "var" आवश्यक है?

मैंने यह भी देखा कि इन सभी उदाहरणों में कीवर्ड "var" का उपयोग संपत्ति से पहले नहीं किया जाता है, क्यों? किसी संपत्ति के नाम से पहले "var" घोषित करना आवश्यक नहीं है क्योंकि यह उल्लेख किया गया है कि गुण चर हैं।

मैं एक और बात पूछना भूल गया: way2 में

और नाम way3 की वस्तु अपरकेस जहां way1 में है ऑब्जेक्ट का नाम लोअर केस में है में है ... क्या मामला हम के लिए उपयोग करना चाहिए एक वस्तु का नाम?

रास्ता 1

function person(fname,lname,age,eyecolor) 
{ 
    this.firstname=fname; 
    this.lastname=lname; 
    this.age=age; 
    this.eyecolor=eyecolor; 
} 

myFather=new person("John","Doe",50,"blue"); 
document.write(myFather.firstname + " is " + myFather.age + " years old."); 

रास्ता 2

var Robot = 
{ 
    metal: "Titanium", 
    killAllHumans: function() 
    { 
     alert("Exterminate!"); 
    } 
}; 
Robot.killAllHumans(); 

तरह से 3 (जावास्क्रिप्ट वस्तुओं सरणी सिंटैक्स का उपयोग):

var NewObject = {}; 
NewObject['property1'] = value; 
NewObject['property2'] = value; 
NewObject['method'] = function(){ /* function code here */ } 
+2

"var" चर का दायरा के आधार पर किया जाता है, यह वैश्विक परिभाषित करता है या नहीं, इसे खोजें और आप अंतर देखेंगे। – jackJoe

+61

यदि आप homicidal रोबोट बनाते हैं, तो हमेशा 'var' का उपयोग करें, कृपया .. इसे छोड़कर उन्हें वैश्विक – mykhal

+8

** "चर का उपयोग चर के दायरे के आधार पर किया जाता है" ** - यह बीएडी अभ्यास है - इसका उपयोग किया जाना चाहिए इससे कोई फर्क नहीं पड़ता कि आप – treecoder

उत्तर

150

कोई सबसे अच्छा तरीका नहीं है, उस पर निर्भर आपका उपयोग केस

  • उपयोग रास्ता 1 आप कई समान वस्तुओं बनाना चाहते हैं। आपके उदाहरण में, Person (आपको पूंजी अक्षर के साथ नाम शुरू करना चाहिए) कन्स्ट्रक्टर फ़ंक्शन कहा जाता है। यह अन्य ओओ भाषाओं में कक्षा के समान है।
  • रास्ता 2 का उपयोग करें यदि आपको केवल एक ऑब्जेक्ट एक प्रकार की तरह (एक सिंगलटन) की आवश्यकता है। यदि आप इस ऑब्जेक्ट को दूसरे से प्राप्त करना चाहते हैं, तो आपको कन्स्ट्रक्टर फ़ंक्शन का उपयोग करना होगा।
  • रास्ता 3 का उपयोग करें यदि आप वस्तु के गुणों को इसके अन्य गुणों के आधार पर प्रारंभ करना चाहते हैं या यदि आपके पास गतिशील संपत्ति नाम हैं।

अद्यतन: तीसरे तरीके से अनुरोध किए गए उदाहरणों के रूप में।

निर्भर गुण:

निम्नलिखित के रूप में thisनहींbook का उल्लेख काम नहीं करता।एक वस्तु शाब्दिक में अन्य संपत्तियों के मूल्यों के साथ एक संपत्ति प्रारंभ करने में कोई तरीका नहीं है:

var book = { 
    price: somePrice * discount, 
    pages: 500, 
    pricePerPage: this.price/this.pages 
}; 
बजाय

, तुम कर सकते हो सकता है:

var book = { 
    price: somePrice * discount, 
    pages: 500 
}; 
book.pricePerPage = book.price/book.pages; 
// or book['pricePerPage'] = book.price/book.pages; 

गतिशील संपत्ति नाम:

तो संपत्ति नाम कुछ परिवर्तनीय में संग्रहीत किया गया है या कुछ अभिव्यक्ति के माध्यम से बनाया गया है, तो आपको ब्रैकेट नोटेशन का उपयोग करना होगा:

var name = 'propertyName'; 

// the property will be `name`, not `propertyName` 
var obj = { 
    name: 42 
}; 

// same here 
obj.name = 42; 

// this works, it will set `propertyName` 
obj[name] = 42; 
+1

आपके उत्तर के लिए धन्यवाद ... अब मैं अपना पहला बिंदु समझ गया हूं, अगर हम myFather = new person ("John", "Doe", 50, "blue") जैसे कुछ चाहते हैं तो हम अपना पहला बिंदु समझ सकते हैं। myMother = नया व्यक्ति ("आलसी", "डो", 45, "ब्राउन"); mybrother = नया व्यक्ति ("सर्वेक्षण", "डो", 15, "नीला"); – Jamna

+0

मुझे लगता है कि आप obj [name] = 42 का मतलब है। ठीक है? –

+0

मैं यह इंगित करना चाहता हूं कि विकल्प 2 और 3 वस्तुतः समान हैं, बस आप ऑब्जेक्ट बनाने के बाद गुण निर्दिष्ट कर रहे हैं। यह _literal नोटेशन_ कहा जाता है, क्योंकि आप अपनी ऑब्जेक्ट बनाने के लिए _object literal_ का उपयोग कर रहे हैं। हुड के तहत, यह वास्तव में "नया ऑब्जेक्ट()" कहता है। आप इसके बारे में यहां और अधिक पढ़ सकते हैं: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Working_with_Objects – dudewad

8

ऑब्जेक्ट बनाने के लिए कोई "सर्वश्रेष्ठ तरीका" नहीं है। आपके उपयोग के मामले के आधार पर प्रत्येक तरीके से लाभ होता है।

कन्स्ट्रक्टर पैटर्न (new ऑपरेटर के साथ इसे जोड़ने के लिए एक फ़ंक्शन जोड़ा गया है) प्रोटोटाइप विरासत का उपयोग करने की संभावना प्रदान करता है, जबकि अन्य तरीकों से नहीं। तो यदि आप प्रोटोटाइप विरासत चाहते हैं, तो एक कन्स्ट्रक्टर फ़ंक्शन जाने का एक अच्छा तरीका है।

हालांकि, यदि आप प्रोटोटाइप विरासत चाहते हैं, तो आप Object.create का भी उपयोग कर सकते हैं, जिससे विरासत अधिक स्पष्ट हो जाती है।

ऑब्जेक्ट शाब्दिक बनाना (उदा: var obj = {foo: "bar"};) यदि आपके पास सृजन समय पर हाथों पर सेट करने के लिए सभी संपत्तियां होंगी तो बहुत अच्छा काम करता है।

बाद में गुणों को सेट करने के लिए, NewObject.property1 सिंटैक्स आमतौर पर NewObject['property1'] के लिए बेहतर है यदि आप संपत्ति का नाम जानते हैं। लेकिन उत्तरार्द्ध उपयोगी है जब आपके पास वास्तव में समय से पहले संपत्ति का नाम नहीं है (उदा: NewObject[someStringVar])।

आशा है कि इससे मदद मिलती है!

6

मुझे लगता है कि यह आपके इच्छित चीजों पर निर्भर करता है। सरल वस्तुओं के लिए, मुझे लगता है कि आप दूसरी विधियों का उपयोग कर सकते हैं। जब आपकी वस्तुएं बड़ी हो जाती हैं और आप समान वस्तुओं का उपयोग करने की योजना बना रहे हैं, तो मुझे लगता है कि पहली विधि बेहतर होगी। इस तरह आप प्रोटोटाइप का उपयोग करके इसे भी बढ़ा सकते हैं।

उदाहरण:

function Circle(radius) { 
    this.radius = radius; 
} 
Circle.prototype.getCircumference = function() { 
    return Math.PI * 2 * this.radius; 
}; 
Circle.prototype.getArea = function() { 
    return Math.PI * this.radius * this.radius; 
} 

मैं तीसरी विधि के एक बड़े प्रशंसक नहीं हूँ, लेकिन यह गतिशील संपादन संपत्तियों के लिए वास्तव में उपयोगी है, उदाहरण के var foo='bar'; var bar = someObject[foo]; के लिए।

98

फ़ंक्शन को परिभाषित करने के कई तरीके हैं। यह पूरी तरह से आपकी आवश्यकता पर आधारित है।नीचे कुछ शैलियों प्रकार हैं: -

  1. वस्तु निर्माता
  2. शाब्दिक निर्माता
  3. समारोह के आधार
  4. Protoype आधार
  5. समारोह और प्रोटोटाइप के आधार
  6. सिंगलटन आधारित

उदाहरण:

  1. वस्तु निर्माता
var person = new Object(); 

person.name = "Anand", 
person.getName = function(){ 
    return this.name ; 
}; 
  1. शाब्दिक निर्माता
var person = { 
    name : "Anand", 
    getName : function(){ 
    return this.name 
    } 
} 
  1. समारोह निर्माता
function Person(name){ 
    this.name = name 
    this.getName = function(){ 
    return this.name 
    } 
} 
  1. प्रोटोटाइप
function Person(){}; 

Person.prototype.name = "Anand"; 
  1. समारोह/प्रोटोटाइप संयोजन
function Person(name){ 
    this.name = name; 
} 
Person.prototype.getName = function(){ 
    return this.name 
} 
  1. सिंगलटन
var person = new function(){ 
    this.name = "Anand" 
} 

यदि आप कोई भ्रम है, तो आप इसे कंसोल पर आज़मा सकते हैं।

+0

हे @Alex_Nabu - मैंने पहले ही अपनी पोस्ट में उदाहरण साझा किए हैं। यदि आपको अभी भी किसी भी चुनौतियों का सामना करना पड़ता है तो कृपया मुझे अपडेट करें मैं आपकी मदद करूंगा। –

+1

क्या अंत में सटीक वही व्यक्ति 'उदाहरण उत्पन्न करने वाले प्रत्येक उदाहरण को बनाने के लिए और अधिक समझदारी नहीं होगी? उदाहरण के लिए फ़ंक्शन कन्स्ट्रक्टर में आप बस 'var person = new person ("आनंद") जोड़ सकते हैं। और प्रतीत होता है कि यादृच्छिक अर्ध-कॉलन उपयोग के साथ क्या हो रहा है? : पी – cregox

3

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

constructer कार्यों

वहाँ रहे हैं निर्मित constructer कार्यों है कि हम सब उन्हें समय-समय पर उपयोग कर सकते हैं की तारीख(), संख्या(), बूलियन() आदि की तरह, सभी constructer कार्यों कैपिटल अक्षर से शुरू

निर्माता का एक नया उदाहरण बनाने के लिए,

function Box (Width, Height, fill) { 
    this.width = Width; // The width of the box 
    this.height = Height; // The height of the box 
    this.fill = true; // Is it filled or not? 
} 

और आप इसे आह्वान कर सकते हैं, बस नई (का प्रयोग करके), नीचे की तरह कुछ बना सकते हैं और कहते हैं:, इस बीच में हम कस्टम निर्माता समारोह जावास्क्रिप्ट में इस तरह बना सकते हैं भरे पैरामीटर के साथ कन्स्ट्रक्टर फ़ंक्शन:

var newBox = new Box(8, 12, true); 

वस्तु शाब्दिक

वस्तु शाब्दिक का उपयोग करना बहुत जावास्क्रिप्ट में वस्तु बनाने के मामले उपयोग किया जाता है, यह एक सरल वस्तु बनाने का एक उदाहरण है, तो आप कुछ भी अपने वस्तु संपत्तियों के लिए जब तक वे परिभाषित कर रहे हैं प्रदान कर सकते हैं:

var person = { 
    name: "Alireza", 
    surname: "Dezfoolian" 
    nose: 1, 
    feet: 2, 
    hands: 2, 
    cash: null 
}; 

प्रोटोटाइप

एक बनाने के बाद वस्तु, आपको लगता है कि करने के लिए और अधिक सदस्यों प्रोटोटाइप कर सकते हैं, उदाहरण के लिए हमारे बॉक्स करने के लिए रंग जोड़ने के लिए, हम यह कर सकते हैं:

Box.prototype.colour = 'red'; 
संबंधित मुद्दे

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