2011-09-08 14 views
5

निम्नलिखित कोड पर विचार करें:जावास्क्रिप्ट में "नया" एक फ़ंक्शन - इसका क्या अर्थ है?

var f = function() { return 10; } 
typeof f;       // returns "function" 
f();        // returns 10 

var g = f; 
g();        // returns 10, obviously 

var h = new f; 
h;        // console evaluates to f - ???? 
h();        // Type error - called_non_callable 
typeof h;       // returns "object" 

तो, क्या ज यहाँ है? क्रोम कंसोल इसे एफ के रूप में मूल्यांकन करने लगता है, लेकिन यह कॉल करने योग्य नहीं है। इस तरह के एक समारोह को "नया" करने का क्या अर्थ है? एच अब एफ से कैसे संबंधित है?

एक अलग रूप में के रूप में, इन दो पंक्तियों बराबर होना दिखाई:

var h = new f; 
var h = new f(); 

क्या उस के साथ हो रहा है?

+2

संभावित डुप्लिकेट [जावास्क्रिप्ट में 'नया' कीवर्ड क्या है?] (Http://stackoverflow.com/questions/1646698/what-is-the-new-keyword-in-javascript) –

उत्तर

4

आपके भ्रम की जड़ यह है कि क्रोम अपने कंसोल पर वस्तुओं का प्रतिनिधित्व करता है।

अपने उदाहरण में अभिव्यक्ति new f() Chrome की सांत्वना उत्पादन पर 'f' के रूप में प्रस्तुत किया जाता है, लेकिन सिर्फ एक मात्र इस विशेष सांत्वना की "सुविधा" के रूप में, उदाहरण के लिए, निम्न वस्तु प्रवेश करने:

({constructor: function Foo(){}}); 

इसे "Foo" के रूप में प्रदर्शित किया जाएगा। असल में कंसोल प्रतिनिधित्व खोजने का प्रयास करता है जिसमें से आपकी सामग्री का उदाहरण है।

तो, कंसोल आपको f दिखाता है, लेकिन आप फ़ंक्शन लॉगिंग नहीं कर रहे हैं, new ऑपरेटर f.prototype से प्राप्त होने वाली ऑब्जेक्ट उत्पन्न करता है।

आप समारोह से 10 लौट रहे हैं, लेकिन जब से तुम इसे new साथ कहते हैं, और वापसी प्रकार एक आदिम है, मूल्य त्याग दिया जाता है, नव निर्मित वस्तु विरासत में उस रूप f.prototype दिया जाता है।

उदाहरण के लिए:

var F = function() { return 10; }; 
F.prototype.inherited = 'foo'; 

var h = new F(); // the 10 returned is ignored 
h instanceof F; // true 
h.inherited; // "foo" 

दूसरी ओर, यदि आप एक निर्माता, वस्तु दृष्टान्त कि new ऑपरेटर scened पीछे बनाता है (और निर्माता के प्रोटोटाइप से विरासत) से एक ऑब्जेक्ट प्रदान करता है, तो खो जाएगा उदाहरण के लिए:

var F = function() { return {}; }; 
F.prototype.inherited = 'foo'; 

var h = new F(); // the empty object is returned 
h instanceof F; // false 
h.inherited; // undefined 

हाँ, new f; और new f();, पूरी तरह से बराबर रहे हैं, हालांकि लोगों को अपने कोड को स्पष्ट बना करने के लिए कोष्ठकों का उपयोग की सलाह देते हैं।

+0

सर्वश्रेष्ठ में से एक एसओ पर स्पष्टीकरण! इसे सरल रखने के लिए धन्यवाद। – demisx

1

असल में, नया कीवर्ड एक नई वस्तु के निर्माता के रूप में कॉल करता है। इस सवाल का पहला जबाब, StackOverflow पर, यह काफी अच्छी तरह से सार:

What is the 'new' keyword in JavaScript?

4

यह कैसे जावास्क्रिप्ट में वस्तु उन्मुखीकरण काम करता है। यदि आप किसी फ़ंक्शन पर new पर कॉल करते हैं, तो इस फ़ंक्शन का मानना ​​होगा कि यह एक वर्ग का निर्माता है (कीवर्ड class अन्य भाषाओं की तरह कक्षा को परिभाषित करने के लिए जेएस में मौजूद नहीं है)।

तो बुला var h = new f();h वर्ग f की एक वस्तु बना देता है, और एक वस्तु ही प्रतिदेय नहीं है (यही कारण है कि आप called_non_callable मिलता है)।

अगर आप अपने "वर्ग" कुछ methots देना चाहते हैं, तो आप इसे इस करना चाहिए:

function cat(name) { 
    this.name = name; 
    this.talk = function() { 
     alert(this.name + " says meeow!") 
    } 
} 

cat1 = new cat("felix") 
cat1.talk() //alerts "felix says meeow!" 

cat2 = new cat("ginger") 
cat2.talk() //alerts "ginger says meeow!" 

this tutorial की page 2 से एक उदाहरण है कि। अधिक जानकारी के लिए, पढ़ें या ask Google for object-orientation in JavaScript

1

जावास्क्रिप्ट में, फ़ंक्शंस केवल फ़ंक्शंस नहीं हैं, और वे केवल ऑब्जेक्ट्स नहीं हैं; वे प्रकार के लिए परिभाषित रचनाकारों के लिए भी उपयोग किया जाता है।

आम तौर पर, जब आपके पास f फ़ंक्शन होता है, तो वह फ़ंक्शन किसी प्रकार को परिभाषित करता है, चाहे वह इरादा हो या नहीं। तो लाइन

var h = new f(); 

एक वस्तु h जिसका प्रकार f है परिभाषित करता है।

मैं लाइन

var h = new f; 

कभी नहीं देखा है लेकिन मैं इसे दूसरी लाइन के रूप में ही करता है यह सोचते हैं रहा हूँ।

2

मैं https://developer.mozilla.org/en/JavaScript/Reference/Operators/Special/this, खासकर "फंक्शन संदर्भ" पर अनुभाग पढ़ने की अनुशंसा करता हूं।

संक्षेप में, जब आप new समारोह, आप एक नया वस्तु बना रहे हैं: var h = new f;

यह कहते हैं: "प्रकार f की h नामित चर द्वारा संदर्भित एक नई वस्तु बनाएँ"। फ़ंक्शन को तब आप एक कन्स्ट्रक्टर के रूप में माना जाता है जो आप उम्मीद कर रहे हैं।

ऑब्जेक्ट बनने के बाद, यह अब कॉल करने योग्य नहीं है (यही कारण है कि आप h() लाइन पर कोई त्रुटि अनुभव कर रहे हैं।

अधिकांश भाषा में (जावास्क्रिप्ट को बाहर नहीं रखा गया), एक निर्माता के () वैकल्पिक हैं (जब तक आवश्यक पैरामीटर (कुछ भाषाओं में) नहीं होते हैं)।

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