2012-02-19 8 views
52

मुझे जेएस में कुछ एक्सटेंशन विधियां लिखने की जरूरत है। मुझे पता है कि सी # में ऐसा कैसे करें। उदाहरण:मैं जावास्क्रिप्ट में एक विस्तार विधि कैसे लिखूं?

string firstName = "Bob"; 
string hi = firstName.SayHi(); 

मैं जावास्क्रिप्ट में कुछ इस तरह कैसे करना होगा:

public static string SayHi(this Object name) 
{ 
    return "Hi " + name + "!"; 
} 

और फिर से बुलाया?

उत्तर

94

कि विशिष्ट मामले में, आप, String.prototype करने के लिए अपने विधि आवंटित था इस तरह:

String.prototype.SayHi = function SayHi() { 
    return "Hi " + this + "!"; 
}; 

या एक गैर गणनीय संपत्ति Object.defineProperty (ES5 और उच्च है, तो मूल रूप से, सब कुछ लेकिन IE8 और का उपयोग कर के रूप में बेहतर पहले):

Object.defineProperty(String.prototype, "SayHi", { 
    value: function SayHi() { 
     return "Hi " + this + "!"; 
    } 
}); 

जावास्क्रिप्ट एक प्रोटोटाइपिकल भाषा है। इसका मतलब है कि प्रत्येक ऑब्जेक्ट को प्रोटोटाइप ऑब्जेक्ट द्वारा समर्थित किया जाता है। जावास्क्रिप्ट में, उस प्रोटोटाइप को ऑब्जेक्ट के लिए कन्स्ट्रक्टर फ़ंक्शन या नए (आईएसएच) ECMAScript5 Object.create फ़ंक्शन द्वारा असाइन किया गया है।

पूर्व मामले (कन्स्ट्रक्टर फ़ंक्शन) में, किसी ऑब्जेक्ट को असाइन किया गया प्रोटोटाइप कन्स्ट्रक्टर फ़ंक्शन की prototype संपत्ति द्वारा परिभाषित किया गया है। तो एक निर्माता समारोह Foo कहा जाता है अगर तुम है

function Foo() { 
} 

... तो बयान

var f = new Foo(); 

... अपने प्रोटोटाइप वस्तु के रूप में f उदाहरण के लिए Foo.prototype प्रदान करती है। इस प्रकार:

function Foo(b) { 
    this.baz = b; 
} 
Foo.prototype.bar = function bar() { 
    console.log(this.baz); 
}; 

var f = new Foo("Charlie"); 
f.bar(); // logs "Charlie" 
अपने उदाहरण में

तो, firstName के बाद से एक String उदाहरण (वास्तव में एक स्ट्रिंग आदिम है, लेकिन चिंता मत करो जब भी आवश्यक है, यह पूर्ण रूप से अपने एक String उदाहरण के लिए प्रोत्साहित किया जाता है), अपने प्रोटोटाइप String.prototype है है, इसलिए String.prototype पर एक संपत्ति जोड़ना जो आपके SayHi फ़ंक्शन का संदर्भ देता है, वह फ़ंक्शन सभी String उदाहरणों पर उपलब्ध कराता है।

DougR के रूप में एक टिप्पणी में कहा, सी # विस्तार तरीकों से एक अंतर यह है कि सी # के विस्तार के तरीकों can be called on null references (यदि आप एक string विस्तार विधि है, string s = null; s.YourExtensionMethod(); वास्तव में काम करता है) है। जावास्क्रिप्ट के साथ यह सच नहीं है; null इसका अपना प्रकार है और इसके लिए विस्तार करने के लिए कोई प्रोटोटाइप नहीं है।


उन उदाहरणों में फ़ंक्शन नामों के बारे में एक त्वरित नोट, उदा।

Object.defineProperty(String.prototype, "SayHi", { 
    value: function SayHi() { 
// HERE ------------^ 
     return "Hi " + this + "!"; 
    } 
}); 

Foo.prototype.bar = function bar() { 
// AND HERE -----------------^ 
    console.log(this.baz); 
}; 

रूप है, जहाँ हम उस में एक नाम (एक "नाम समारोह अभिव्यक्ति," उर्फ ​​एनएफई) के साथ एक समारोह अभिव्यक्ति उपयोग कर रहे हैं और पहले IE8 पर मुद्दों (होने के लिए प्रसिद्ध हुआ करता था कि, और वास्तव में, कुछ अन्य ब्राउज़रों के वास्तव में पुराने संस्करण)। सबकुछ मर रहा है और आईई 8 लगभग मृत है, अब एनएफई के बारे में चिंता करने की आवश्यकता नहीं है।(और ऊपर आईई 8 में भी ठीक होगा।)

+0

@DougR: क्षमा करें, मानक टिप्पणी सफाई। जब कोई टिप्पणी अप्रचलित हो जाती है, तो मोड या पावर उपयोगकर्ता इसे हटा सकते हैं (मोड इसे सीधे कर सकते हैं, पावर उपयोगकर्ताओं को समीक्षा कतार में टीम बनाना होगा)। मैंने यह जवाब देने के लिए जवाब अपडेट कर दिया है कि आपने इसे ध्वजांकित किया है। :-) –

+1

@ ग्रुंडी: धन्यवाद, हाँ, 'स्ट्रिंग एस = नल;' का पूरा बिंदु 's.YourExtensionMethod()' का उपयोग करना था! पकड़ की सराहना करते हैं। :-) –

+0

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

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