2011-10-11 21 views
15

चलें इस तरह समारोह की कल्पना:जावास्क्रिप्ट में चेन करने योग्य फ़ंक्शन कैसे बनाएं?

var x, y; 
x = 'Notepad'; 
y = foo(x); 
console.log(y); // Prints 'Notepad+'. 

मैं समारोह है कि अन्य कार्यों के साथ chainable है बनाने के लिए एक रास्ता तलाश कर रहा हूँ: जैसे

function foo(x) { 
    x += '+'; 
    return x; 
} 

यह प्रयोग किया जाएगा।

कल्पना कीजिए उपयोग:

var x, y; 
x = 'Notepad'; 
y = x.foo().foo().toUpperCase(); // Prints 'NOTEPAD++'. 
console.log(y); 

मैं यह कैसे करना होगा?

उत्तर

14

ज़रूर, चाल वस्तु वापस जाने के लिए एक बार आप इसे संशोधित करने काम हो गया है:

String.prototype.foo = function() { 
    return this + "+"; 
} 

var str = "Notepad"; 
console.log(str.foo().foo().toUpperCase()); 

http://jsfiddle.net/Xeon06/vyFek/

विधि String पर उपलब्ध कराने के लिए, मैं यह प्रोटोटाइप है संशोधित कर रहा हूँ। Object पर ऐसा न करने के लिए सावधान रहें, क्योंकि यह उनके गुणों की गणना करते समय समस्याएं पैदा कर सकता है।

+3

इसे जोड़ने से पहले देशी प्रकारों पर कम से कम किसी संपत्ति की जांच करना अच्छा विचार है, यानी 'if (! (String.prototype में' foo ')) {String.prototype.foo = function() {.. ।}} ' – keeganwatkins

+0

यदि आप गणना को तोड़ने के बिना किसी ऑब्जेक्ट को विस्तारित करना चाहते हैं, तो (अर्ध-आधुनिक) [' object.defineProperty'] का उपयोग करें (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/ ऑब्जेक्ट/डिफ़ाइनप्रोपर्टी): 'ऑब्जेक्ट.डेफिनप्रोपर्टी (स्ट्रिंग.प्रोटोटाइप, {वैल्यू: फ़ंक्शन() {इसे + + + +;}} वापस करें) '। डिफ़ॉल्ट रूप से 'गणना करने योग्य' ध्वज 'झूठा' पर सेट होता है। – Phrogz

+0

@ किगानवाटकिन्स हाँ यह है :)। मुझे लगता है कि ओपी केवल उदाहरण के रूप में तारों के बारे में पूछ रहा था, इसलिए मैंने चेतावनियों को न्यूनतम रखा, लेकिन यह एक अच्छा मुद्दा है। –

6

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

var obj = 
{ 
    f1: function() { ...do something...; return this;}, 
    f2: function() { ...do something...; return this;} 
} 

तो आप श्रृंखला कर सकते हैं की तरह obj.f1().f2()

कॉल ध्यान रखें, आप को प्राप्त करने के लिए आप क्या() obj.f1 फोन करके उम्मीद कर रहे हैं नहीं कर सकेंगे toUpperCase()। - यह f1() को निष्पादित करेगा, "यह" वापस करेगा और obj.toUpperCase() को कॉल करने का प्रयास करेगा।