2011-08-21 13 views
7

मैं दिनांक वस्तु से प्राप्त विरासत बनाने और ऑब्जेक्ट करने की कोशिश कर रहा हूं।जावास्क्रिप्ट दिनांक ऑब्जेक्ट से कैसे प्राप्त किया जाए?

नीचे मैं जो करने की कोशिश कर रहा हूं उसका फायरबग प्रतिलेख है।

>>> date_son = Object.create(Date) 
Function {} 
>>> typeof date_son 
"object" 
>>> date_son.gettime 
undefined 
>>> date_son.prototype.getTime 
getTime() 

मैं ऑब्जेक्ट दिनांक बनाने के लिए ऑब्जेक्ट.क्रेट का उपयोग करता हूं जो तारीख से विरासत में आता है। GetTime फ़ंक्शन/विशेषता date_son.protype पर उपलब्ध है, लेकिन date_son ऑब्जेक्ट पर ही नहीं।

मैं स्पष्ट रूप से कुछ गलत कर रहा हूं। क्या कोई मुझे सही दिशा में इंगित कर सकता है कि किसी ऑब्जेक्ट को तिथि से विरासत में कैसे बनाया जाए ताकि date_son.getTime() date_son ऑब्जेक्ट पर उपलब्ध हो।

मैं सीधे तारीख का विस्तार नहीं करना चाहता, क्योंकि मुझे लगता है कि गड़बड़/बदलते ग्लोबल्स खराब प्रोग्रामिंग अभ्यास है।

+2

जावास्क्रिप्ट केस-संवेदी है। आप 'date_son.prototype.getTime' के साथ' date_son.gettime' को विपरीत कर रहे हैं; पूंजीकरण में अंतर देखें। –

+2

यह अभी भी 'अपरिभाषित' होगा क्योंकि 'दिनांक' एक 'फंक्शन' ऑब्जेक्ट है, न कि 'दिनांक' ऑब्जेक्ट। – user113716

+1

आप इसके बजाय 'Date.prototype' से विस्तार कर सकते हैं, और यह आपको विधियां देगा, लेकिन मुझे नहीं पता कि यह आपको क्या अच्छा लगेगा, क्योंकि जब आप उन्हें आमंत्रित करते हैं तो वे डेट ऑब्जेक्ट पर काम नहीं करेंगे। – user113716

उत्तर

1

आप ऐसा कर सकता है:

var date_son = Object.create(Date.prototype); 

लेकिन यह बहुत अच्छा करने के लिए, क्योंकि आप एक Date के अलावा कुछ पर उन तरीकों बुला हो जाएगा प्रतीत नहीं होता।

console.log(date_son.getTime()); // won't work 

आप इस तरह यह कह सकते हैं, लेकिन मैं नहीं जानता कि क्यों तुम करना चाहते हैं:,

var date_son = Object.create(Date.prototype); 

var new_date = new Date(); 

console.log(date_son.getTime.call(new_date)); // 1313964470748 

आप कुछ दिनांक उपयोगिताओं जोड़ना चाहते हैं और आप Date.prototype का विस्तार नहीं करना चाहते हैं, फिर केवल Date ऑब्जेक्ट को स्वीकार करने वाली विधियों की एक लाइब्रेरी बनाएं।

var date_son = { 
    some_method: function(d) { 
     // do something with the date 
     return d; 
    } 
}; 

var date = date_son.some_method(new Date); 
+0

आप दो बार जवाब क्यों देते हैं? :( – Raynos

+0

@ रेनोस: मैं वास्तव में अपने अवतार को देखना पसंद करता हूं! असल में, मेरे मूल उत्तर ने 'var date_son = Object.create (date.prototype) की पेशकश की; 'समाधान के बिना समाधान यह एक उपयोगी समाधान था। विधियों तक पहुंच, लेकिन ओपी का इरादा रखने के लिए वे बेकार थे। – user113716

2

वहाँ MDN डॉक्स मोज़िला द्वारा पर एक नोट (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Date) है:

नोट: ध्यान दें कि दिनांक वस्तुओं केवल दिनांक बुला या एक निर्माता के रूप में यह उपयोग करके instantiated जा सकता है; अन्य जावास्क्रिप्ट ऑब्जेक्ट प्रकारों के विपरीत, दिनांक ऑब्जेक्ट्स में कोई शाब्दिक वाक्यविन्यास नहीं है।

Object.create पैरामीटर दिए जाने पर एक उदाहरण की अपेक्षा करता है। Date अपने आप पर कोई उदाहरण नहीं है और इसलिए ऑब्जेक्ट.क्रेट के साथ काम नहीं करेगा।

इसके अलावा, दिनांक सीधे विस्तार के साथ आपके प्रश्नों के उत्तर:

देशी वस्तुओं का विस्तार है जो नियमित रूप से किया जाता है कुछ है।MooTools उदाहरण के लिए यह करता है अपने स्वयं के .implement विधि के साथ:

https://github.com/mootools/mootools-more/blob/master/Source/Types/Date.js#L55

विस्तार मूल निवासी के बारे में ट्यूटोरियल:

http://net.tutsplus.com/tutorials/javascript-ajax/quick-tip-how-to-extend-built-in-objects-in-javascript/

संपादित:

और के प्रकल्पित बुराइयों के बारे में एक लेख मूल निवासी: http://perfectionkills.com/extending-built-in-native-objects-evil-or-not/

+1

'ऑब्जेक्ट.क्रेट' किसी ऑब्जेक्ट को शाब्दिक उम्मीद नहीं करता है; यह किसी ऑब्जेक्ट के उदाहरण की अपेक्षा करता है। उदाहरण के लिए, 'ऑब्जेक्ट.क्रेट ([1, 2, 3]) 'ठीक काम करता है, जैसा कि' var x = [1, 2, 3]; ऑब्जेक्ट.क्रेट (x) 'या' ऑब्जेक्ट.क्रेट (नया नंबर (3)) ' – Domenic

+0

धन्यवाद, मैंने अपना संपादित किया है तदनुसार पोस्ट करें। शाब्दिक और उदाहरण मिश्रित था। – Luwe

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