आपके भ्रम की जड़ यह है कि क्रोम अपने कंसोल पर वस्तुओं का प्रतिनिधित्व करता है।
अपने उदाहरण में अभिव्यक्ति 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();
, पूरी तरह से बराबर रहे हैं, हालांकि लोगों को अपने कोड को स्पष्ट बना करने के लिए कोष्ठकों का उपयोग की सलाह देते हैं।
संभावित डुप्लिकेट [जावास्क्रिप्ट में 'नया' कीवर्ड क्या है?] (Http://stackoverflow.com/questions/1646698/what-is-the-new-keyword-in-javascript) –