जावास्क्रिप्ट में 'नया' कीवर्ड क्या है?


1744

newजावास्क्रिप्ट में कीवर्ड काफी भ्रमित जब वह पहली बार सामना करना पड़ा है, के रूप में लोगों को लगता है कि जावास्क्रिप्ट एक वस्तु उन्मुख प्रोग्रामिंग भाषा नहीं है करते हैं हो सकता है।

  • यह क्या है?
  • यह किन समस्याओं का समाधान करता है?
  • यह कब उचित है और कब नहीं?

10
इसके अलावा, संबंधित धागा - stackoverflow.com/questions/383402/…
चेतन शास्त्री

इन उदाहरणों को पहले लोगों, डेवलपर.
mozilla.org/en-US/docs/Web/JavaScript/Reference/… पर

जवाबों:


2144

यह 5 चीजें करता है:

  1. यह एक नई वस्तु बनाता है। इस ऑब्जेक्ट का प्रकार केवल ऑब्जेक्ट है
  2. यह इस नए ऑब्जेक्ट की आंतरिक, दुर्गम, [[प्रोटोटाइप]] (यानी __proto__ ) को सेट करता है जो कि कंस्ट्रक्टर फ़ंक्शन की बाहरी, सुलभ, प्रोटोटाइप ऑब्जेक्ट (प्रत्येक फ़ंक्शन ऑब्जेक्ट में स्वचालित रूप से एक प्रोटोटाइप संपत्ति) हो।
  3. यह thisनए बनाए गए ऑब्जेक्ट के लिए चर बिंदु बनाता है ।
  4. यह जब भी thisउल्लेख किया जाता है, तब नई बनाई गई वस्तु का उपयोग करते हुए, कंस्ट्रक्टर फ़ंक्शन को निष्पादित करता है।
  5. यह नई बनाई गई वस्तु लौटाता है, जब तक कि कंस्ट्रक्टर फ़ंक्शन एक गैर- nullऑब्जेक्ट संदर्भ नहीं देता है। इस स्थिति में, उस ऑब्जेक्ट संदर्भ को इसके बजाय लौटा दिया जाता है।

नोट: कंस्ट्रक्टर फ़ंक्शनnew कीवर्ड के बाद फ़ंक्शन को संदर्भित करता है , जैसे कि

new ConstructorFunction(arg1, arg2)

एक बार यह हो जाने के बाद, यदि नई वस्तु की अपरिभाषित संपत्ति का अनुरोध किया जाता है, तो स्क्रिप्ट वस्तु की [[प्रोटोटाइप]] वस्तु के बदले वस्तु की जांच करेगी । यह है कि आप जावास्क्रिप्ट में पारंपरिक वर्ग विरासत के समान कुछ प्राप्त कर सकते हैं।

इसके बारे में सबसे कठिन हिस्सा बिंदु संख्या 2 है। प्रत्येक वस्तु (कार्यों सहित) में यह आंतरिक गुण होता है जिसे [[प्रोटोटाइप]] कहा जाता है । इसे केवल ऑब्जेक्ट क्रिएशन के समय पर सेट किया जा सकता है, या तो नए के साथ , Object.create के साथ , या शाब्दिक (फ़ंक्शन के लिए डिफ़ॉल्ट रूप से कार्य करता है), संख्याओं से संख्या। संख्या, आदि। इसे केवल Object.getPrototypOf (someObject) के साथ पढ़ा जा सकता है । इस मान को सेट या पढ़ने का कोई अन्य तरीका नहीं है

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


यहाँ एक उदाहरण है:

ObjMaker = function() {this.a = 'first';};
// ObjMaker is just a function, there's nothing special about it that makes 
// it a constructor.

ObjMaker.prototype.b = 'second';
// like all functions, ObjMaker has an accessible prototype property that 
// we can alter. I just added a property called 'b' to it. Like 
// all objects, ObjMaker also has an inaccessible [[prototype]] property
// that we can't do anything with

obj1 = new ObjMaker();
// 3 things just happened.
// A new, empty object was created called obj1.  At first obj1 was the same
// as {}. The [[prototype]] property of obj1 was then set to the current
// object value of the ObjMaker.prototype (if ObjMaker.prototype is later
// assigned a new object value, obj1's [[prototype]] will not change, but you
// can alter the properties of ObjMaker.prototype to add to both the
// prototype and [[prototype]]). The ObjMaker function was executed, with
// obj1 in place of this... so obj1.a was set to 'first'.

obj1.a;
// returns 'first'
obj1.b;
// obj1 doesn't have a property called 'b', so JavaScript checks 
// its [[prototype]]. Its [[prototype]] is the same as ObjMaker.prototype
// ObjMaker.prototype has a property called 'b' with value 'second'
// returns 'second'

यह वर्ग की विरासत की तरह है क्योंकि अब, आपके द्वारा उपयोग की जाने वाली कोई भी वस्तु new ObjMaker()'बी' संपत्ति को विरासत में मिली हुई प्रतीत होगी।

यदि आप उपवर्ग जैसा कुछ चाहते हैं, तो आप ऐसा करते हैं:

SubObjMaker = function () {};
SubObjMaker.prototype = new ObjMaker(); // note: this pattern is deprecated!
// Because we used 'new', the [[prototype]] property of SubObjMaker.prototype
// is now set to the object value of ObjMaker.prototype.
// The modern way to do this is with Object.create(), which was added in ECMAScript 5:
// SubObjMaker.prototype = Object.create(ObjMaker.prototype);

SubObjMaker.prototype.c = 'third';  
obj2 = new SubObjMaker();
// [[prototype]] property of obj2 is now set to SubObjMaker.prototype
// Remember that the [[prototype]] property of SubObjMaker.prototype
// is ObjMaker.prototype. So now obj2 has a prototype chain!
// obj2 ---> SubObjMaker.prototype ---> ObjMaker.prototype

obj2.c;
// returns 'third', from SubObjMaker.prototype

obj2.b;
// returns 'second', from ObjMaker.prototype

obj2.a;
// returns 'first', from SubObjMaker.prototype, because SubObjMaker.prototype 
// was created with the ObjMaker function, which assigned a for us

मैं इस विषय पर अंत में इस पृष्ठ को खोजने से पहले एक टन बकवास पढ़ता हूं , जहां यह अच्छा चित्र के साथ बहुत अच्छी तरह से समझाया गया है।


47
बस जोड़ना चाहता था: वास्तव में आंतरिक [[प्रोटोटाइप]] तक पहुंचने का एक तरीका है, __proto__ द्वारा। यह हालांकि गैर-मानक है, और केवल अपेक्षाकृत नए ब्राउज़रों द्वारा समर्थित है (और उन सभी को नहीं)। एक मानकीकृत तरीका सामने आ रहा है, जिसका नाम है Object.getPrototypOf (obj), लेकिन यह Ecmascript3.1 है, और यह केवल नए ब्राउजर पर ही समर्थित है - फिर से। यह आमतौर पर उस संपत्ति का उपयोग नहीं करने के लिए सिफारिश की जाती है, सामान वहां के अंदर वास्तविक तेजी से जटिल हो जाता है।
Blub

9
प्रश्न: ObjMakerमान लौटाने वाले फ़ंक्शन के रूप में परिभाषित किए जाने पर क्या अलग होता है ?
जिम ब्लैकलर

13
@LonelyPixel newमौजूद है ताकि आपको फ़ंक्शन / ऑब्जेक्ट बनाने / कॉपी करने के लिए फ़ैक्टरी विधियाँ लिखने की ज़रूरत न पड़े । इसका अर्थ है, "इसे कॉपी करें, इसे अपने माता-पिता की 'क्लास' की तरह बनायें; इतनी कुशलता से और सही ढंग से करें, और इनहेरिटेंस जानकारी संग्रहीत करें जो कि केवल मेरे लिए उपलब्ध है, जेएस, आंतरिक रूप से"। ऐसा करने के लिए, यह prototypeनए ऑब्जेक्ट के अन्यथा दुर्गम आंतरिक को संशोधित करने के लिए विरासत में मिला सदस्य, शास्त्रीय OO वंशानुक्रम श्रृंखला (जो क्रमिक रूप से परिवर्तनीय नहीं हैं) की नकल करता है। आप इसके बिना अनुकरण कर सकते हैं new, लेकिन वंशानुक्रम क्रमिक रूप से परिवर्तनीय होगा। अच्छा? खराब? आप पर निर्भर करता है।
इंजीनियर

11
जोड़ने के लिए एक छोटा बिंदु: एक निर्माणकर्ता को एक कॉल, जब नए कीवर्ड से पहले, स्वचालित रूप से बनाई गई वस्तु को वापस करता है; निर्माणकर्ता के भीतर से इसे स्पष्ट रूप से वापस करने की कोई आवश्यकता नहीं है।
चार्ली ने

7
एक नोट है जो कहता है Notice that this pattern is deprecated!। कक्षा के प्रोटोटाइप को सेट करने के लिए सही अप-टू-डेट पैटर्न क्या है?
टॉम पॉज़्रुक

400

मान लें कि आपके पास यह फ़ंक्शन है:

var Foo = function(){
  this.A = 1;
  this.B = 2;
};

यदि आप इसे स्टैंडअलोन फ़ंक्शन के रूप में कहते हैं, तो:

Foo();

इस फ़ंक्शन को निष्पादित करने से windowऑब्जेक्ट ( Aऔर B) में दो गुण जुड़ जाएंगे । यह इसे windowइसलिए जोड़ता है क्योंकि windowवह ऑब्जेक्ट है जिसे फ़ंक्शन कहा जाता है जब आप इसे उसी तरह निष्पादित करते हैं, और thisफ़ंक्शन में वह फ़ंक्शन होता है जिसे फ़ंक्शन कहा जाता है। जावास्क्रिप्ट में कम से कम।

अब, इसे इस तरह से कॉल करें new:

var bar = new Foo();

जब आप newकिसी फ़ंक्शन कॉल में जोड़ते हैं तो क्या होता है कि एक नया ऑब्जेक्ट बनाया जाता है (बस var bar = new Object()) और thisफ़ंक्शन के भीतर आप जिस फ़ंक्शन को फ़ंक्शन कहते हैं Object, उसके बजाय केवल आपके द्वारा बनाए गए नए को इंगित करता है। तो barअब गुणों के साथ एक वस्तु है Aऔर B। कोई भी फंक्शन एक कंस्ट्रक्टर हो सकता है, यह हमेशा समझ में नहीं आता है।


7
निष्पादन के संदर्भ पर निर्भर करता है। मेरे मामले में (Qt स्क्रिप्टिंग) यह सिर्फ एक वैश्विक वस्तु है।
मैक्सिम

2
क्या यह अधिक मेमोरी उपयोग का कारण होगा?
जर्गेन पॉल

2
क्योंकि विंडो वह ऑब्जेक्ट है जिसे फ़ंक्शन कहा जाता है - होना चाहिए: क्योंकि विंडो वह ऑब्जेक्ट है जिसमें फ़ंक्शन होता है।
दावीद होर्वथ

1
@ टोरस वेब ब्राउजर में एक गैर-विधि फ़ंक्शन windowनिहित रूप से एक विधि होगी । एक बंद में भी, चाहे गुमनामी में। हालांकि, उदाहरण में यह खिड़की पर एक सरल विधि है: Foo();=> [default context].Foo();=> window.Foo();। इस अभिव्यक्ति windowमें संदर्भ है (न केवल कॉलर , जो कोई फर्क नहीं पड़ता)।
दविद होर्वाथ

1
@ वृषभ मूल रूप से हाँ। हालांकि ECMA में 6 और 7 चीजें अधिक जटिल हैं (लंबोदा, कक्षाएं, आदि देखें)।
दविद होर्वाथ

164

डैनियल हॉवर्ड के जवाब के अलावा, यहाँ है कि क्या newकरता है (या कम से कम ऐसा लगता है):

function New(func) {
    var res = {};
    if (func.prototype !== null) {
        res.__proto__ = func.prototype;
    }
    var ret = func.apply(res, Array.prototype.slice.call(arguments, 1));
    if ((typeof ret === "object" || typeof ret === "function") && ret !== null) {
        return ret;
    }
    return res;
}

जबकि

var obj = New(A, 1, 2);

के बराबर है

var obj = new A(1, 2);

73
मैंने पाया कि जावास्क्रिप्ट अंग्रेजी से समझने में आसान है: v
damphat

बहुत बढ़िया जवाब। मेरा एक छोटा सा सवाल है: यह कैसे संभव func.prototypeहो सकता है null? क्या आप कृपया उस पर थोड़ा विस्तार कर सकते हैं?
टॉम पॉज़्रुक

6
@tomp आप प्रोटोटाइप संपत्ति को ओवरराइड कर सकते हैं, बस लिखने से A.prototype = null;उस मामले new A()में वस्तु पर परिणाम होगा, ऑब्जेक्ट के लिए आंतरिक प्रोटोटाइप इंगित करता Objectहै: jsfiddle.net/Mk42Z
basilikum

2
टाइपोफ़ चेक गलत हो सकता है क्योंकि एक होस्ट ऑब्जेक्ट "ऑब्जेक्ट" या "फ़ंक्शन" की तुलना में कुछ अलग उत्पादन कर सकता है। यह परखने के लिए कि क्या कोई वस्तु है, मुझे पसंद है Object(ret) === ret
ओरिऑल

2
@Oriol टिप्पणी के लिए धन्यवाद। यह सच है कि आप क्या कहते हैं और किसी भी वास्तविक परीक्षण को और अधिक मजबूत तरीके से किया जाना चाहिए। हालांकि, मुझे लगता है कि इस वैचारिक उत्तर के लिए, typeofपरीक्षण सिर्फ यह समझना आसान बनाता है कि पर्दे के पीछे क्या चल रहा है।
तुलसीकुम

109

शुरुआती लोगों के लिए इसे बेहतर समझना

ब्राउज़र कंसोल में निम्न कोड आज़माएं।

function Foo() { 
    return this; 
}

var a = Foo();       //returns window object
var b = new Foo();   //returns empty object of foo

a instanceof Window;  // true
a instanceof Foo;     // false

b instanceof Window;  // false
b instanceof Foo;     // true

अब आप समुदाय विकि उत्तर पढ़ सकते हैं :)


4
अच्छा उत्तर। इसके अलावा - बाहर जाने से return this;समान उत्पादन होता है।
नेल्लू

37

इसलिए यह संभवतः वस्तु के उदाहरण बनाने के लिए नहीं है

यह बिल्कुल उसी के लिए उपयोग किया जाता है। आप एक फ़ंक्शन निर्माता को इस तरह परिभाषित करते हैं:

function Person(name) {
    this.name = name;
}

var john = new Person('John');

हालाँकि ECMAScript का अतिरिक्त लाभ यह है कि आप .prototypeसंपत्ति के साथ विस्तार कर सकते हैं, इसलिए हम कुछ ऐसा कर सकते हैं ...

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

इस कंस्ट्रक्टर से बनाई गई सभी वस्तुओं में अब getNameप्रोटोटाइप चेन की वजह से उनकी पहुंच होगी।


6
फ़ंक्शन कन्स्ट्रक्टर्स का उपयोग कक्षाओं की तरह किया जाता है, कोई classकीवर्ड नहीं है लेकिन आप एक ही काम कर सकते हैं।
पदक विजेता

किफ़ॉफ़ एक क्लास कीवर्ड है - क्लास भविष्य के उपयोग के लिए आरक्षित है
ग्रेग

11
संयोग से यही कारण है कि आप .className का उपयोग नहीं करते हैं। एक CSS वर्ग निर्धारित करने के लिए .assass
ग्रेग

23
यह सम्मेलन द्वारा व्यक्ति को पूंजीकृत किया जाना चाहिए।
इरोमॉफ

27

जावास्क्रिप्ट है एक वस्तु उन्मुख प्रोग्रामिंग भाषा है और यह उदाहरणों बनाने के लिए वास्तव में प्रयोग किया जाता है। यह कक्षा-आधारित के बजाय प्रोटोटाइप-आधारित है, लेकिन इसका मतलब यह नहीं है कि यह ऑब्जेक्ट-ओरिएंटेड नहीं है।


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

14

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

ऑब्जेक्ट के लिए कक्षाएं आवश्यक नहीं हैं - जावास्क्रिप्ट एक प्रोटोटाइप आधारित भाषा है।


12

पहले से ही कुछ बहुत अच्छे जवाब हैं, लेकिन मैं एक मामले में III के बारे में अपने अवलोकन पर जोर देने के लिए एक नया पोस्ट कर रहा हूं जब आप किसी फ़ंक्शन में एक स्पष्ट रिटर्न स्टेटमेंट लेते हैं तो आप क्या करते हैं new। नीचे के मामलों पर एक नजर:

केस I :

var Foo = function(){
  this.A = 1; 
  this.B = 2;
};
console.log(Foo()); //prints undefined
console.log(window.A); //prints 1

ऊपर अनाम फ़ंक्शन द्वारा इंगित किए गए कॉल करने का एक सादा मामला है Foo। जब आप इस फ़ंक्शन को कॉल करते हैं तो यह वापस आ जाता है undefined। चूंकि कोई स्पष्ट वापसी विवरण नहीं है, इसलिए जावास्क्रिप्ट दुभाषिया बलपूर्वक return undefined;फ़ंक्शन के अंत में एक बयान सम्मिलित करता है । यहाँ विंडो इन्वोकेशन ऑब्जेक्ट (प्रासंगिक this) है जिसे नया Aऔर Bगुण मिलता है।

केस II :

var Foo = function(){
  this.A = 1;
  this.B = 2;
};
var bar = new Foo();
console.log(bar()); //illegal isn't pointing to a function but an object
console.log(bar.A); //prints 1

यहाँ जावास्क्रिप्ट दुभाषिया newखोजशब्द को देखते हुए एक नई वस्तु बनाता है जो उसके द्वारा बताए गए thisअनाम फ़ंक्शन के इन्वोकेशन ऑब्जेक्ट (प्रासंगिक ) के रूप में कार्य करता है Foo। इस मामले में Aऔर Bनए बने ऑब्जेक्ट (विंडो ऑब्जेक्ट के स्थान पर) पर गुण हो जाते हैं। चूंकि आपके पास कोई स्पष्ट रिटर्न स्टेटमेंट नहीं है, इसलिए जावास्क्रिप्ट दुभाषिया newकीवर्ड के उपयोग के कारण बनाई गई नई वस्तु को वापस करने के लिए जबरदस्ती एक रिटर्न स्टेटमेंट सम्मिलित करता है ।

केस III :

var Foo = function(){
  this.A = 1;
  this.B = 2;
  return {C:20,D:30}; 
};
var bar = new Foo();
console.log(bar.C);//prints 20
console.log(bar.A); //prints undefined. bar is not pointing to the object which got created due to new keyword.

यहाँ फिर से जावास्क्रिप्ट दुभाषिया newखोजशब्द को देखते हुए एक नई वस्तु बनाता है जो thisइंगित किए गए अनाम फ़ंक्शन के मंगलाचरण ऑब्जेक्ट (संदर्भ ) के रूप में कार्य करता है Foo। फिर से, Aऔर Bनए बने ऑब्जेक्ट पर गुण बनें। लेकिन इस बार आपके पास एक स्पष्ट रिटर्न स्टेटमेंट है, इसलिए जावास्क्रिप्ट दुभाषिया अपना कुछ भी नहीं करेगा ।

केस III में ध्यान देने वाली बात यह है कि newकीवर्ड के कारण बनाई जा रही वस्तु आपके रडार से खो गई है। barवास्तव में एक पूरी तरह से अलग वस्तु की ओर इशारा करता है जो कि वह नहीं है जो कि जावास्क्रिप्ट दुभाषिया newकीवर्ड के कारण बनाया गया है ।

JavaScripit से डेविड फ्लानगन का उद्धरण: द निश्चित गाइड (6 वां संस्करण), चौ। 4, पृष्ठ # 62:

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

--- अतिरिक्त जानकारी ---

उपरोक्त मामलों के कोड स्निपेट में उपयोग किए जाने वाले कार्यों में जेएस दुनिया में नीचे दिए गए विशेष नाम हैं:

केस I और II - कंस्ट्रक्टर फ़ंक्शन

केस III - फैक्टरी फ़ंक्शन। फ़ैक्टरी फ़ंक्शंस का उपयोग उस कीवर्ड के साथ नहीं किया जाना चाहिएnew जो मैंने वर्तमान थ्रेड में अवधारणा को समझाने के लिए किया है।

आप इस धागे में उनके बीच अंतर के बारे में पढ़ सकते हैं ।


आपका मामला 3, एक gr8 अवलोकन है
appu

5

कभी-कभी कोड शब्दों की तुलना में आसान होता है:

var func1 = function (x) { this.x = x; }                    // used with 'new' only
var func2 = function (x) { var z={}; z.x = x; return z; }   // used both ways
func1.prototype.y = 11;
func2.prototype.y = 12;

A1 = new func1(1);      // has A1.x  AND  A1.y
A2 =     func1(1);      // undefined ('this' refers to 'window')
B1 = new func2(2);      // has B1.x  ONLY
B2 =     func2(2);      // has B2.x  ONLY

मेरे लिए, जब तक मैं प्रोटोटाइप नहीं करता, मैं फंक 2 की शैली का उपयोग करता हूं क्योंकि यह मुझे फ़ंक्शन के अंदर और बाहर थोड़ा अधिक लचीलापन देता है।


3
B1 = new func2(2); <- ऐसा क्यों नहीं होगा B1.y ?
धूप_देव

@ sunny_dev मैं जेएस विशेषज्ञ नहीं हूं, लेकिन शायद इसलिए कि func2 सीधे मान (z ऑब्जेक्ट) पर लौट रहा है, काम करने के बजाय / आंतरिक मूल्यों के साथ लौट रहा है (यह)
ईगल

5

newकीवर्ड संदर्भ जिसके तहत समारोह चलाया जा रहा है बदल जाता है और इस संदर्भ के लिए सूचक देता है।

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


यह गुंजाइश के संदर्भ में एक बहुत ही व्यावहारिक जवाब है। उत्तर के अलावा जी -8।
अप्पू

3

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

obj = new Element();

2

सारांश:

newकीवर्ड एक निर्माता समारोह से एक वस्तु बनाने के लिए जावास्क्रिप्ट में प्रयोग किया जाता है। newकीवर्ड से पहले निर्माता समारोह कॉल रखा जाना है और निम्नलिखित बातें करना होगा:

  1. एक नई वस्तु बनाता है
  2. इस फ़ंक्शन के प्रोटोटाइप को कंस्ट्रक्टर फ़ंक्शन के प्रोटोटाइप प्रॉपर्टी पर सेट करता है
  3. thisनए बनाए गए ऑब्जेक्ट में कीवर्ड को बांधता है और कंस्ट्रक्टर फ़ंक्शन को निष्पादित करता है
  4. नई बनाई गई वस्तु लौटाता है

उदाहरण:

function Dog (age) {
  this.age = age;
}

const doggie = new Dog(12);

console.log(doggie);
console.log(doggie.__proto__ === Dog.prototype) // true

वास्तव में क्या होता है:

  1. const doggie कहता है: हमें एक चर घोषित करने के लिए स्मृति की आवश्यकता है।
  2. एसिगमेंट ऑपरेटर =कहता है: हम इस वेरिएबल को एक्सप्रेशन के साथ शुरू करने जा रहे हैं=
  3. अभिव्यक्ति है new Dog(12)। JS इंजन नया कीवर्ड देखता है, एक नई ऑब्जेक्ट बनाता है और प्रोटोटाइप को Dog.prototype में सेट करता है
  4. कंस्ट्रक्टर फ़ंक्शन को thisनई ऑब्जेक्ट पर सेट मान के साथ निष्पादित किया जाता है । इस चरण में वह जगह है जहाँ आयु को नए बनाए गए डॉगी ऑब्जेक्ट को सौंपा गया है।
  5. नई बनाई गई वस्तु को लौटाया गया है और चर कुत्ते को सौंपा गया है।

1

newकीवर्ड एक निर्माता के रूप में कार्य का उपयोग कर वस्तुओं के उदाहरण पैदा करता है। उदाहरण के लिए:

var Foo = function() {};
Foo.prototype.bar = 'bar';

var foo = new Foo();
foo instanceof Foo; // true

उदाहरणों prototypeको कंस्ट्रक्टर फ़ंक्शन से विरासत में मिला है । तो ऊपर दिया गया उदाहरण ...

foo.bar; // 'bar'

2
नया कीवर्ड मूल रूप से फ़ंक्शन को पहले से ही कंस्ट्रक्टर के रूप में जोड़ता है; आपको कुछ भी वापस करने की आवश्यकता नहीं है। आप बस कर सकते हैं: फ़ंक्शन फू (x) {this.bar = x; } var obj = new foo (10); चेतावनी (obj.bar);
21

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

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

1

खैर जावास्क्रिप्ट प्रति सी प्लेटफॉर्म से प्लेटफॉर्म तक बहुत भिन्न हो सकता है क्योंकि यह हमेशा मूल विनिर्देश एक्मास्क्रिप्ट का कार्यान्वयन है।

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

ECMAScript एक ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग लैंग्वेज है, जो किसी होस्ट वातावरण के भीतर कम्प्यूटेशनल ऑब्जेक्ट्स की संगणना और हेरफेर करने के लिए है।

इसलिए अब हम मान चुके हैं कि जावास्क्रिप्ट एक्मास्क्रिप्ट का एक कार्यान्वयन है और इसलिए यह एक वस्तु-उन्मुख भाषा है। newकिसी भी ऑब्जेक्ट-ओरिएंटेड भाषा में ऑपरेशन की परिभाषा , कहती है कि इस तरह के कीवर्ड का उपयोग किसी निश्चित प्रकार के वर्ग (अनाम प्रकारों सहित, C # जैसे मामलों में) से ऑब्जेक्ट इंस्टेंस बनाने के लिए किया जाता है।

EcmaScript में हम कक्षाओं का उपयोग नहीं करते हैं, जैसा कि आप ऐनक से पढ़ सकते हैं:

ECMAScript C ++, स्मॉलटाक या जावा जैसे वर्गों का उपयोग नहीं करता है। इसके बजाय वस्तुओं को विभिन्न तरीकों से बनाया जा सकता है, जिसमें शाब्दिक संकेतन या कंस्ट्रक्टरों के माध्यम से शामिल हैं जो ऑब्जेक्ट बनाते हैं और फिर कोड को निष्पादित करते हैं जो उनके गुणों को प्रारंभिक मान निर्दिष्ट करके सभी या उनमें से कुछ को आरंभ करता है। प्रत्येक कंस्ट्रक्टर एक फ़ंक्शन होता है, जिसमें एक प्रॉपर्टी नाम होता है - प्रोटोटाइप function जिसका उपयोग प्रोटोटाइप - आधारित विरासत और साझा गुणों को लागू करने के लिए किया जाता है।
नई अभिव्यक्तियों में निर्माणकर्ताओं का उपयोग करके ऑब्जेक्ट बनाए जाते हैं ; उदाहरण के लिए, नया दिनांक (2009,11) एक नई दिनांक ऑब्जेक्ट बनाता है। नए का उपयोग किए बिना एक निर्माता को आमंत्रित करने के परिणाम हैं जो निर्माणकर्ता पर निर्भर करते हैं। उदाहरण के लिए, दिनांक () एक वस्तु के बजाय वर्तमान तिथि और समय का एक स्ट्रिंग प्रतिनिधित्व करता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.