जावास्क्रिप्ट में ऑब्जेक्ट बनाने के लिए कौन सा तरीका सबसे अच्छा है? क्या एक वस्तु संपत्ति से पहले `var` आवश्यक है?


177

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

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

दूसरे और तीसरे तरीके में, ऑब्जेक्ट का नाम अपर-केस में है जबकि पहले तरीके में ऑब्जेक्ट का नाम लोअर-केस में है। किसी वस्तु के नाम के लिए हमें किस मामले का उपयोग करना चाहिए?

पहला तरीका:

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.");

दूसरा तरीका:

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

Robot.killAllHumans();

तीसरा तरीका - सरणी सिंटैक्स का उपयोग करके जावास्क्रिप्ट ऑब्जेक्ट:

var NewObject = {};

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

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

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

9
"var का उपयोग वेरिएबल के दायरे के आधार पर किया जाता है" - यह BAD प्रैक्टिस है - इसका उपयोग किसी भी तरह से किया जाना चाहिए चाहे आप किसी भी दायरे में हों
treecoder

1
क्या विधि के बारे में Object.create():?
मैक्स

यह अच्छा होगा यदि "जैसा कि उल्लेख किया गया है कि गुण चर हैं" स्पष्ट किया गया था। यह कौन है"? इसका उल्लेख कहां है? क्या आप एक विशिष्ट उद्धरण का हवाला दे सकते हैं?
user4642212

जवाबों:


181

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

  • यदि आप कई समान वस्तुओं को बनाना चाहते हैं तो 1 का उपयोग करें । आपके उदाहरण में, Person(आपको बड़े अक्षर से नाम शुरू करना चाहिए) को कंस्ट्रक्टर फ़ंक्शन कहा जाता है । यह अन्य OO भाषाओं में कक्षाओं के समान है ।
  • यदि आप केवल एक तरह की एक वस्तु (एक सिंगलटन की तरह) की जरूरत है, तो रास्ते 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
आपके उत्तर के लिए धन्यवाद ... अब मुझे आपकी पहली बात समझ आ गई है कि हम way1 का उपयोग कर सकते हैं यदि हम इस तरह का कुछ चाहते हैं तो = मेरे नए व्यक्ति ("जॉन", "डो", 50, "ब्लू"); myMother = नया व्यक्ति ("आलसी", "डो", 45, "भूरा"); myBrother = नया व्यक्ति ("पोल", "डो", 15, "ब्लू");
जमना

मुझे लगता है कि आप का मतलब है obj [नाम] = 42. सही है?
कीथ पिंसन

मैं यह बताना चाहता हूं कि विकल्प २ और ३ वस्तुतः समान हैं, बस यही है कि आप वस्तु बनाने के बाद आपको गुण प्रदान कर रहे हैं। इसे ही शाब्दिक अंकन कहा जाता है , क्योंकि आप अपनी वस्तु बनाने के लिए एक वस्तु शाब्दिक का उपयोग कर रहे हैं । हुड के तहत, यह वास्तव में "नई वस्तु ()" कहता है। आप इसके बारे में यहाँ और अधिक पढ़ सकते हैं: developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…
dudewad

दूसरे मामले के लिए, क्या यह समझ में आता है कि अगर हमने प्रसार ऑपरेटर ...का उपयोग किसी अन्य वस्तु से विरासत में किया है?
पैक बच्चा

114

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

  1. ऑब्जेक्ट कंस्ट्रक्टर
  2. शाब्दिक रचनाकार
  3. कार्य आधारित
  4. प्रोटॉयपे आधारित
  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"
} 

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


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

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

2
यह प्रत्येक तरीके से पेशेवरों और विपक्षों को समझाने वाले मूल्य को जोड़ देगा।
RayLoveless

10

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

कंस्ट्रक्टर पैटर्न ( 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];


3

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

निर्माण कार्य करता है

अंतर्निहित निर्माण कार्य हैं जिन्हें हम सभी समय-समय पर उपयोग कर सकते हैं, जैसे दिनांक (), संख्या (), बुलियन () आदि, सभी निर्माण कार्य कैपिटल अक्षर से शुरू होते हैं, इस बीच हम जावास्क्रिप्ट में कस्टम कंस्ट्रक्टर फ़ंक्शन बना सकते हैं। इस तरह:

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

2

जबकि यहां कई लोग कहते हैं कि ऑब्जेक्ट निर्माण के लिए कोई सबसे अच्छा तरीका नहीं है, एक तर्क है कि क्यों जावास्क्रिप्ट में 2019 तक ऑब्जेक्ट बनाने के लिए बहुत सारे तरीके हैं, और यह विभिन्न पुनरावृत्तियों पर जावास्क्रिप्ट की प्रगति के साथ करना है EcmaScript की 1997 में वापस डेटिंग जारी हुई।

ईसीएमएस्क्रिप्ट 5 से पहले, ऑब्जेक्ट बनाने के केवल दो तरीके थे: कंस्ट्रक्टर फ़ंक्शन या शाब्दिक अंकन (नई वस्तु का बेहतर विकल्प) ()। कंस्ट्रक्टर फ़ंक्शन संकेतन के साथ आप एक ऑब्जेक्ट बनाते हैं जिसे कई उदाहरणों में (नए कीवर्ड के साथ) इंस्टेंट किया जा सकता है, जबकि शाब्दिक अंकन एकल ऑब्जेक्ट को सिंगलटन की तरह वितरित करता है।

// constructor function
function Person() {};

// literal notation
var Person = {};

आपके द्वारा उपयोग की जाने वाली विधि के बावजूद, जावास्क्रिप्ट ऑब्जेक्ट्स मुख्य मूल्य जोड़े के गुण हैं:

// Method 1: dot notation
obj.firstName = 'Bob';

// Method 2: bracket notation. With bracket notation, you can use invalid characters for a javascript identifier.
obj['lastName'] = 'Smith';

// Method 3: Object.defineProperty
Object.defineProperty(obj, 'firstName', {
    value: 'Bob',
    writable: true,
    configurable: true,
    enumerable: false
})

// Method 4: Object.defineProperties
Object.defineProperties(obj, {
  firstName: {
    value: 'Bob',
    writable: true
  },
  lastName: {
    value: 'Smith',
    writable: false
  }
});

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

function Person(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;

    this.sayName = function(){
        return "My name is " + this.firstName + " " + this.lastName;
    }
} 

var bob = new Person("Bob", "Smith");
bob instanceOf Person // true

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

स्मृति संसाधनों में वृद्धि के अलावा, निर्माण कार्य के अंदर तरीकों को परिभाषित करना विरासत की संभावना को समाप्त करता है। फिर से, विधि को नए बनाए गए ऑब्जेक्ट और किसी अन्य ऑब्जेक्ट पर एक संपत्ति के रूप में परिभाषित किया जाएगा, इसलिए विरासत की तरह काम नहीं कर सकता है। इसलिए, जावास्क्रिप्ट जावास्क्रिप्ट के रूप में प्रोटोटाइप श्रृंखला प्रदान करता है, जिससे जावास्क्रिप्ट एक प्रोटोटाइप भाषा बन जाती है।

यदि आपके पास माता-पिता हैं और माता-पिता बच्चे के कई गुणों को साझा करते हैं, तो बच्चे को उन गुणों को प्राप्त करना चाहिए। ES5 से पहले, यह निम्नानुसार पूरा किया गया था:

function Parent(eyeColor, hairColor) {
    this.eyeColor = eyeColor;
    this.hairColor = hairColor;
}

Parent.prototype.getEyeColor = function() {
  console.log('has ' + this.eyeColor);
}

Parent.prototype.getHairColor = function() {
  console.log('has ' + this.hairColor);
}

function Child(firstName, lastName) {
  Parent.call(this, arguments[2], arguments[3]);
  this.firstName = firstName;
  this.lastName = lastName;
}

Child.prototype = Parent.prototype;

var child = new Child('Bob', 'Smith', 'blue', 'blonde');
child.getEyeColor(); // has blue eyes
child.getHairColor(); // has blonde hair

जिस तरह से हमने ऊपर प्रोटोटाइप श्रृंखला का उपयोग किया है, उसमें एक विचित्रता है। चूंकि प्रोटोटाइप एक लाइव लिंक है, इसलिए प्रोटोटाइप चेन में किसी एक ऑब्जेक्ट की प्रॉपर्टी को बदलकर, आप उसी ऑब्जेक्ट की दूसरी प्रॉपर्टी को भी बदल रहे होंगे। जाहिर है, बच्चे की विरासत में मिली विधि को बदलने से माता-पिता के तरीके को नहीं बदलना चाहिए। Object.create ने पॉलीफ़िल का उपयोग करके इस समस्या को हल किया। इस प्रकार, Object.create के साथ, आप प्रोटोटाइप श्रृंखला में माता-पिता की समान संपत्ति को प्रभावित किए बिना किसी बच्चे की संपत्ति को प्रोटोटाइप श्रृंखला में सुरक्षित रूप से संशोधित कर सकते हैं।

ECMAScript 5 ने ऑब्जेक्ट क्रिएशन के लिए कंस्ट्रक्टर फंक्शन में उपरोक्त बग को हल करने के लिए Object.create की शुरुआत की। Object.create () विधि नई बनी हुई वस्तु के प्रोटोटाइप के रूप में एक मौजूदा वस्तु का उपयोग करके एक नई वस्तु बनाती है। चूंकि एक नई वस्तु बनाई गई है, अब आपके पास समस्या नहीं है जहां प्रोटोटाइप श्रृंखला में बाल संपत्ति को संशोधित करना श्रृंखला में उस संपत्ति के माता-पिता के संदर्भ को संशोधित करेगा।

var bobSmith = {
    firstName: "Bob",
    lastName: "Smith",
    sayName: function(){
      return "My name is " + this.firstName + " " + this.lastName;
    }
}

var janeSmith = Object.create(bobSmith, {
    firstName : {  value: "Jane" }
})

console.log(bobSmith.sayName()); // My name is Bob Smith
console.log(janeSmith.sayName()); // My name is Jane Smith
janeSmith.__proto__ == bobSmith; // true
janeSmith instanceof bobSmith; // Uncaught TypeError: Right-hand side of 'instanceof' is not callable. Error occurs because bobSmith is not a constructor function.

ES6 से पहले, फ़ंक्शन रचनाकारों और Object.create का उपयोग करने के लिए यहां एक सामान्य रचनात्मक पैटर्न था:

const View = function(element){
  this.element = element;
}

View.prototype = {
  getElement: function(){
    this.element
  }
}

const SubView = function(element){
  View.call(this, element);
}

SubView.prototype = Object.create(View.prototype);

अब निर्माण कार्यों के साथ युग्मित Object.create को जावास्क्रिप्ट में ऑब्जेक्ट निर्माण और विरासत के लिए व्यापक रूप से उपयोग किया गया है। हालांकि, ईएस 6 ने कक्षाओं की अवधारणा को पेश किया, जो मुख्य रूप से जावास्क्रिप्ट के मौजूदा प्रोटोटाइप-आधारित विरासत पर सिंथेटिक चीनी हैं। वर्ग सिंटैक्स जावास्क्रिप्ट में एक नया ऑब्जेक्ट-ओरिएंटेड इनहेरिटेंस मॉडल पेश नहीं करता है। इस प्रकार, जावास्क्रिप्ट एक प्रोटोटाइप भाषा है।

ईएस 6 कक्षाएं विरासत को बहुत आसान बनाती हैं। अब हमें मूल कक्षा के प्रोटोटाइप फ़ंक्शंस को मैन्युअल रूप से कॉपी करना होगा और चाइल्ड क्लास के कंस्ट्रक्टर को रीसेट करना होगा।

// create parent class
class Person {
  constructor (name) {
    this.name = name;
  }
}

// create child class and extend our parent class
class Boy extends Person {
  constructor (name, color) {
    // invoke our parent constructor function passing in any required parameters
    super(name);

    this.favoriteColor = color;
  }
}

const boy = new Boy('bob', 'blue')
boy.favoriteColor; // blue

सभी में, जावास्क्रिप्ट में ऑब्जेक्ट क्रिएशन की इन 5 अलग-अलग रणनीतियों ने एक्मास्क्रिप्ट मानक के विकास को प्रभावित किया।


0

बेशक एक सबसे अच्छा तरीका है। जावास्क्रिप्ट में विशेषणों के पास अनगिनत और गैर-गुणकारी गुण हैं।

var empty = {};
console.log(empty.toString);
// . function toString(){...}
console.log(empty.toString());
// . [object Object]

ऊपर दिए गए उदाहरण में आप देख सकते हैं कि एक खाली वस्तु में वास्तव में गुण हैं।

ठीक है पहले देखते हैं कि सबसे अच्छा तरीका कौन सा है:

var new_object = Object.create(null)

new_object.name = 'Roland'
new_object.last_name = 'Doda'
//etc

console.log("toString" in new_object) //=> false

लॉग के ऊपर के उदाहरण में झूठा आउटपुट होगा।

अब देखते हैं कि अन्य ऑब्जेक्ट निर्माण के तरीके गलत क्यों हैं।

//Object constructor
var object = new Object();

console.log("toString" in object); //=> true

//Literal constructor
var person = { 
  name : "Anand",
  getName : function (){
   return this.name
  } 
} 

console.log("toString" in person); //=> true

//function Constructor
function Person(name){
  this.name = name
  this.getName = function(){
    return this.name
  } 
}

var person = new Person ('landi')

console.log("toString" in person); //=> true

//Prototype
function Person(){};

Person.prototype.name = "Anand";

console.log("toString" in person); //=> true

//Function/Prototype combination
function Person2(name){
  this.name = name;
} 

Person2.prototype.getName = function(){
  return this.name
}

var person2 = new Person2('Roland')

console.log("toString" in person2) //=> true

जैसा कि आप ऊपर देख सकते हैं, सभी उदाहरण सत्य हैं। यदि आपके पास कोई मामला है, तो आपके पास for inयह देखने के लिए एक लूप है कि क्या वस्तु के पास संपत्ति है, तो संभवतः आपको गलत परिणाम मिलेंगे।

ध्यान दें कि यह सबसे आसान तरीका नहीं है। आपको लाइन द्वारा ऑब्जेक्ट लाइन के सभी गुणों को परिभाषित करना होगा। अन्य तरीके अधिक आसान हैं और ऑब्जेक्ट बनाने के लिए कम कोड होंगे लेकिन आपको कुछ मामलों में जागरूक होना होगा। मैं हमेशा "अन्य तरीके" का उपयोग करता हूं और यदि आप सबसे अच्छे तरीके से उपयोग नहीं करते हैं तो उपरोक्त चेतावनी का एक समाधान है:

 for (var property in new_object) {
  if (new_object.hasOwnProperty(property)) {
    // ... this is an own property
  }
 }

0

मुख्य रूप से ऑब्जेक्ट बनाने के 3 तरीके हैं-

सबसे सरल एक वस्तु शाब्दिक उपयोग कर रहा है

const myObject = {}

हालाँकि यह तरीका सबसे सरल है, लेकिन इसका नुकसान भी है, यदि आपकी वस्तु में व्यवहार (इसमें कार्य) हैं, तो भविष्य में यदि आप इसमें कोई बदलाव करना चाहते हैं, तो आपको इसे सभी वस्तुओं में बदलना होगा

तो उस स्थिति में फैक्ट्री या कंस्ट्रक्टर फंक्शंस का उपयोग करना बेहतर होता है। (कोई भी जिसे आप पसंद करते हैं)

फ़ैक्टरी फ़ंक्शंस वे कार्य हैं जो किसी ऑब्जेक्ट को वापस करते हैं।

function factoryFunc(exampleValue){
   return{
      exampleProperty: exampleValue 
   }
}

कंस्ट्रक्टर फ़ंक्शंस उन फ़ंक्शन हैं जो "" "keyword.eg- का उपयोग करके ऑब्जेक्ट को गुण असाइन करते हैं

function constructorFunc(exampleValue){
   this.exampleProperty= exampleValue;
}
const myObj= new constructorFunc(1);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.