2010-08-27 14 views
11

मैं व्यवहार में अंतर को समझता हूं। Date() वर्तमान दिनांक का प्रतिनिधित्व करने वाला एक स्ट्रिंग देता है, और new Date() दिनांक वस्तु का एक उदाहरण देता है जिसका विधियां मैं कॉल कर सकता हूं।जावास्क्रिप्ट में `दिनांक` के उदाहरण के लिए मुझे 'नया' कीवर्ड क्यों चाहिए?

लेकिन मुझे क्यों नहीं पता। जावास्क्रिप्ट प्रोटोटाइप है, इसलिए Date एक फ़ंक्शन और एक ऑब्जेक्ट है जिसमें सदस्य फ़ंक्शन (विधियां) हैं जो ऑब्जेक्ट्स भी हैं। लेकिन मैंने इस तरह से व्यवहार करने वाली किसी भी जावास्क्रिप्ट को लिखा या पढ़ा नहीं है, और मैं अंतर को समझना चाहता हूं।

क्या कोई मुझे एक ऐसे फ़ंक्शन का कुछ नमूना कोड दिखा सकता है जिसमें एक विधि है, नए ऑपरेटर के साथ एक उदाहरण देता है, और स्ट्रिंग को सीधे कॉल करते समय आउटपुट करता है? यानी ऐसा कुछ कैसे होता है?

Date();     // returns "Fri Aug 27 2010 12:45:39 GMT-0700 (PDT)" 
new Date();    // returns Object 
new Date().getFullYear(); // returns 2010 
Date().getFullYear();  // throws exception! 

बहुत विशिष्ट अनुरोध, मुझे पता है। मुझे आशा है कि यह एक अच्छी बात है। :)

+3

पुन * क्यों *: यह एक दुर्भाग्यपूर्ण hango है मूल जावास्क्रिप्ट कार्यान्वयन से ver जिसने इसे ECMAScript spec में बनाया: http://bclary.com/2004/11/07/#a-15.9.2 –

+0

ओह! धन्यवाद। मुझे संदर्भ और इतिहास पसंद है। यह अच्छा है _why_। :) –

+0

धन्यवाद @ क्रिसेंट। मैंने इसे पूर्णता के लिए अपने उत्तर में शामिल किया है। –

उत्तर

3

इनमें से अधिकांश अपने आप को करना संभव है। new के बिना नंगे कन्स्ट्रक्टर को कॉल करना और ईसीएमए स्पेक के प्रति Date के लिए एक स्ट्रिंग प्राप्त करना विशेष है, लेकिन आप इसके लिए कुछ इसी तरह अनुकरण कर सकते हैं।

यहां बताया गया है कि आप इसे कैसे करेंगे। पहले निर्माता पैटर्न में एक वस्तु (है कि new साथ कहा जा करने का इरादा है और जो अपने this संदर्भ देता है जैसे एक समारोह की घोषणा:। बात की

var Thing = function() { 
    // Check whether the scope is global (browser). If not, we're probably (?) being 
    // called with "new". This is fragile, as we could be forcibly invoked with a 
    // scope that's neither via call/apply. "Date" object is special per ECMA script, 
    // and this "dual" behavior is nonstandard now in JS. 
    if (this === window) { 
     return "Thing string"; 
    } 

    // Add an instance method. 
    this.instanceMethod = function() { 
     alert("instance method called"); 
    } 

    return this; 
}; 

न्यू उदाहरणों instanceMethod() उन पर कहा जाता है हो सकता है अब बस जोड़ने के एक " बात ही पर स्थिर "समारोह:

Thing.staticMethod = function() { 
    alert("static method called"); 
}; 

अब आप यह कर सकते हैं:

var t = new Thing(); 
t.instanceMethod(); 
// or... 
new Thing().instanceMethod(); 
// and also this other one.. 
Thing.staticMethod(); 
// or just call it plain for the string: 
Thing(); 
+0

लेकिन 'थिंग()' स्थिर संदर्भ में कुछ भी नहीं करता है। क्या तारीख सिर्फ यह पता लगाती है कि इसे एक स्थिर संदर्भ में बुलाया जा रहा है और किसी ऑब्जेक्ट की बजाय स्ट्रिंग को वापस कर दिया गया है? यदि हां, तो कैसे? –

+0

आपका संपादन इसे स्पष्ट करता है। धन्यवाद। –

+0

अपडेट देखें। यह एक अच्छा सवाल है। मूल प्रश्न पर प्रति @ क्रिसेंट की टिप्पणी, ऐसा लगता है कि 'तिथि' विशेष है। आप उपरोक्त के रूप में इस तरह कुछ हासिल कर सकते हैं, लेकिन कृपया नहीं।यह जेएस में एक आम उपयोग मुहावरे नहीं है। –

0

new किसी ऑब्जेक्ट का एक नया उदाहरण बनाने के लिए जावास्क्रिप्ट (और अन्य) में एक कीवर्ड है।
संभावित रूप से What is the 'new' keyword in JavaScript? का डुप्लिकेट।
यह आलेख भी देखें: http://trephine.org/t/index.php?title=Understanding_the_JavaScript_new_keyword

+0

बस एक अनुमान है, लेकिन मुझे नहीं लगता कि यह मुद्दा यहां है कि नया वापस आ जाएगा और ऑब्जेक्ट होगा। बल्कि यह तथ्य यह है कि दिनांक() को पहले उदाहरण के बिना बुलाया जा सकता है। (सीमित उपयोग के लिए, मैं मानता हूं) पूर्ण तिथि कार्यक्षमता प्राप्त करने के लिए, आपको नए के साथ एक उदाहरण बनाने की आवश्यकता है। – Tom

+0

मुझे पता है कि 'नया' क्या करता है (और मुझे लगता है कि मैंने अपने प्रश्न में यह स्पष्ट किया है)। मुझे नहीं पता कि जब कन्स्ट्रक्टर के रूप में और स्थिर कार्य के रूप में कहा जाता है तो फ़ंक्शन अलग-अलग व्यवहार क्यों करता है। मैं वाक्यविन्यास जानना चाहता हूं जो इस भेद का कारण बनता है। –