कि विशिष्ट मामले में, आप, 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 में भी ठीक होगा।)
@DougR: क्षमा करें, मानक टिप्पणी सफाई। जब कोई टिप्पणी अप्रचलित हो जाती है, तो मोड या पावर उपयोगकर्ता इसे हटा सकते हैं (मोड इसे सीधे कर सकते हैं, पावर उपयोगकर्ताओं को समीक्षा कतार में टीम बनाना होगा)। मैंने यह जवाब देने के लिए जवाब अपडेट कर दिया है कि आपने इसे ध्वजांकित किया है। :-) –
@ ग्रुंडी: धन्यवाद, हाँ, 'स्ट्रिंग एस = नल;' का पूरा बिंदु 's.YourExtensionMethod()' का उपयोग करना था! पकड़ की सराहना करते हैं। :-) –
उस विस्तार विधि को हाइलाइट करने के लिए धन्यवाद शून्य इकाइयों के लिए काम करता है। – Rama