2012-10-02 41 views
6

निकाले बिना एक समारोह ओवरराइड करना अगर मैं इस तरह एक समारोह है:स्थिर गुणों

function a() { 
    console.log('a'); 
} 

और फिर इस तरह एक स्थिर संपत्ति आवंटित:

a.static = 'foo'; 

लेकिन कहते हैं कि मैं के साथ समारोह ओवरराइड करना चाहते इस तरह एक और समारोह:

var old = a; 

a = function() { 
    console.log('new'); 
    old.call(this); 
}; 

a.static // undefined 

जब से मैं a के लिए एक नया समारोह सौंपा, यह स्थैतिक गुण खो गए हैं। क्या स्थिर गुणों को लूपिंग के बिना रखने और मैन्युअल रूप से कॉपी करने का कोई साफ तरीका है?

अद्यतन:

यहाँ एक वास्तविक दुनिया परिदृश्य है:

$.fn.modal = function() { 
    // some code 
}; 

$.fn.modal.defaults = { // some object }; 

तो अगर मैं "विस्तार" करना चाहते हैं: बूटस्ट्रैप jQuery प्लगइन्स में, लेखक इस तरह संपत्ति कार्य करने के लिए चूक प्रदान करती है प्रोटोटाइप मैं सामान्य रूप से करना होगा:

var old = $.fn.modal; 

$.fn.modal = function() { 
    // do my thing 
    old.apply(this, arguments); 
} 

लेकिन उस

होगा
$.fn.modal.defaults === undefined 

यह कार्यक्षमता तोड़ देगा, क्योंकि डिफ़ॉल्ट खो गए हैं। मैं सोच रहा था कि क्या जावास्क्रिप्ट में को बदलने के लिए केवल स्नेही तरीका है, स्थिर गुणों को खोए बिना केवल फ़ंक्शन।

+1

क्या मैं पूछ सकता हूं कि इस तरह के दृष्टिकोण का उपयोग क्या है? यह वास्तव में गंदा लग रहा है। – Christoph

+0

मैं पूछ रहा हूं क्योंकि बूटस्ट्रैप jQuery प्लगइन्स में, लेखक प्रोटोटाइप से जुड़ी ऑब्जेक्ट के रूप में स्थैतिक डिफ़ॉल्ट निर्दिष्ट करता है। इसलिए यदि मैं इसे विस्तारित करना चाहता हूं, तो मैं संलग्न (और संभवतः अन्य गुण) को खो देता हूं जो संलग्न हैं। इसके अलावा, क्योंकि मैं उत्सुक हूं कि केवल फ़ंक्शन को बदलने का कोई तरीका है, न कि यह स्थिर गुण है। – David

उत्तर

3

नहीं, आप यह नहीं कर सकते हैं। ऑब्जेक्ट (फ़ंक्शन) को प्रतिस्थापित करना हमेशा इसके साथ कोई गुण लेता है।

यहां दो समाधान हैं, और दोनों पुरानी वस्तु से गुणों को नए स्थान पर स्थानांतरित करना शामिल करते हैं।

$.fn.plugin = $.extend(function() { ... }, $.fn.plugin); 

दूसरा विकल्प गतिशील रूप से नया समारोह के प्रोटोटाइप स्थापित करने के लिए वर्ष समारोह होने के लिए होगा:

पहले (अनुशंसित) दृष्टिकोण गुण है, जो $.extend साथ आसानी से किया जा सकता है कॉपी करने के लिए है । उदाहरण के लिए, कुछ ब्राउज़रों में यह काम करेगा:

var f = function() { ... }; 
f.__proto__ = $.fn.plugin; 
$.fn.plugin = f; 

हालांकि यह गैर-मानक है और जटिलताओं को जन्म दे सकता है; ऐसा मत करो

+0

मैंने फ़ंक्शन गुणों की प्रतिलिपि बनाने के तरीके के रूप में '$ .extend' के बारे में नहीं सोचा था, लेकिन यह ठीक काम करता है। धन्यवाद – David