जावास्क्रिप्ट नहीं है
तो, आप
PersonProto = { // the "class", or prototype
fname: "thisfname"
};
function Person() { // the constructor function
this.instanceVar = 'foo';
}
की तरह कुछ करने के लिए अब, प्रोटोटाइप करने के लिए निर्माता से कनेक्ट कर सकते हैं दूसरों की तरह कक्षाएं कहा है। विरासत प्रोटोटाइप के माध्यम से हल किया जाता है जो संक्षेप में नव निर्मित वस्तु पर गैर-हटाने योग्य संपत्ति संदर्भ बनाने से कुछ भी नहीं करता है। जावास्क्रिप्ट में सरल डेटा ऑब्जेक्ट्स, अर्थात् ऑब्जेक्ट लिटलल्स के विकल्प भी हैं।
जावास्क्रिप्ट में एक 'क्लास' की भिन्नता इस तरह के रूप में परिभाषित किया जाना चाहिए:
// I use function statements over variable declaration
// when a constructor is involved.
function Person(name) {
this.name = name;
}
// All instances of Person create reference methods to it's prototype.
// These references are not deletable (but they can be overwritten).
Person.prototype = {
speak: function(){
alert(this.name + ' says: "Hello world!"');
}
};
var Mary = new Person('Mary');
Mary.speak(); // alerts 'Mary says: "Hello world!"'
this
संदर्भ हमेशा function
के मालिक के लिए अंक। यदि आप ऑपरेटर के बिना Person
पर कॉल करते हैं, तो मालिक वैश्विक दायरा (विंडो) होगा। यदि आप अपने संदर्भ में गुण निर्दिष्ट करने के लिए इस संदर्भ का उपयोग नहीं करते हैं, तो गुणों को बस चर के रूप में घोषित किया जाएगा। यदि आप var
कथन का उपयोग नहीं करते हैं, तो उन घोषणाओं में वैश्विक चर बनाएंगे जो खराब हैं!
इस
एक निर्माता समारोह में this
संदर्भ का उपयोग के बारे में अधिक निहायत महत्वपूर्ण है कि आप वर्तमान उदाहरण के लिए गुण जोड़ने के लिए चाहते हैं। this
का उपयोग किए बिना, आप केवल एक चर (जो एक संपत्ति के समान नहीं है) बनाते हैं और जैसा कि बताया गया है, यदि आप var कथन का उपयोग नहीं करते हैं, तो आप वैश्विक चर बनाते हैं।
function Person(){
name = 'Mary'
}
var p = new Person();
alert(p.name); // undefined, did not use 'this' to assign it to the instance.
alert(name); // 'Mary', boo, it created a global variable!
उपयोग इस!
function Person(){
this.name = 'Mary'
}
var p = new Person();
alert(p.name); // 'Mary', yay!
alert(name); // undefined, yay!
ध्यान दें, समारोह निर्माता के माध्यम से एक उदाहरण के लिए असाइन किया कुछ भी विरासत में मिला नहीं की जा सकती जब तक आप इसे प्रोटोटाइप को असाइन करने और समारोह निर्माता में फिर से ऊपर लिख यह एक स्वामित्व वाली संपत्ति बनाने के लिए।
जब आप एक निर्माता के रूप में दोगुनी फ़ंक्शन के माध्यम से एक नया उदाहरण बनाते हैं, तो वास्तव में निम्न होता है।
pseudo code:
copy Person.prototype as person
invoke Person function on person
return person
असल में, जब आप कक्षा का उदाहरण बनाते हैं तो यह प्रत्येक शास्त्रीय भाषा में होता है। लेकिन जावास्क्रिप्ट में मुख्य अंतर यह है कि यह एक अच्छा वर्ग कथन के अंदर encapsulated नहीं है। मूल रूप से जावास्क्रिप्ट में फ़ंक्शन कन्स्ट्रक्टर भी नहीं थे लेकिन बाद में जोड़ा गया क्योंकि सन ने मांग की कि वे जावास्क्रिप्ट जावा की तरह अधिक हों।
वस्तु शाब्दिक
वस्तुओं है कि केवल आंतरिक डेटा ले जाने और कोई तरीकों वस्तु शाब्दिक हैं के लिए समारोह निर्माताओं के लिए विकल्प।
var Mary = {
firstName: 'Mary',
lastName: 'Littlelamb'
};
कौन सा आंतरिक वस्तुओं की घोषणा नहीं बल्कि उसके बाद की पसंदीदा तरीका है:
// do not ever do this!
var Mary = new Object();
Mary.firstName = 'Mary';
Mary.lastName = 'Littlelamb';
अपने कौशल सेट में वस्तु शाब्दिक साथ
, आप module pattern (का उपयोग करते हुए आंतरिक डेटा वस्तुओं के लिए एक कारखाना पैटर्न बना सकते हैं जो आम तौर पर सिंगलेट के लिए)।
var createPerson = function(firstName, lastName){
return {
firstName: firstName,
lastName: lastName
}
}
var Mary = createPerson('Mary', 'Littlelamb');
यह कुछ आरामदायक कैप्सूलीकरण को प्राप्त होता है, लेकिन केवल आंतरिक डेटा वस्तुओं के लिए इस्तेमाल किया जा सकता।
ऑब्जेक्ट लिटल और जावास्क्रिप्ट के साथ आप एक और चीज प्रतिनिधिमंडल है, जिसे प्राथमिकता दी जानी चाहिए।
var personMethods = {
speak: function(){
alert(this.firstName + ' says: "Hello world!"');
}
};
var Mary = {
firstName: "Mary",
lastName: "Littlelamb"
};
var Peter = {
firstName: "Peter",
lastName: "Crieswolf"
};
personMethods.speak.apply(Mary); // alerts 'Mary says: "Hello world!"'
personMethods.speak.apply(Peter); // alerts 'Peter says: "Hello world!"'
इसे क्यों पसंद किया जाना चाहिए?क्योंकि यह आपके ऑब्जेक्ट्स को मिनट और पठनीय रखता है, यहां तक कि प्रोटोटाइपिकल संदर्भ मेमोरी लेते हैं और विरासत और 'सबक्लासिंग' का उपयोग करते समय आप उन बच्चों के उदाहरणों के साथ समाप्त होते हैं जिनमें बहुत से अप्रयुक्त विधि संदर्भ होते हैं। प्रतिनिधि हमेशा बेहतर होता है।
क्यों downvote? –
'व्यक्ति' कक्षा नहीं है, जावास्क्रिप्ट में कक्षा की तरह कुछ भी नहीं है। जावास्क्रिप्ट में 'प्रोटोटाइप विरासत' के साथ ऑब्जेक्ट्स हैं, लेकिन 'व्यक्ति' इस मामले में केवल एक ऑब्जेक्ट है, इसमें एक विधि भी नहीं है, यह केवल एक हैश मैप/डिक्शनरी है जिसे आप इसे कॉल करना चाहते हैं। कुछ अच्छे स्पष्टीकरण के लिए नीचे बीजीरिसन का उत्तर देखें। –
@Ivo आमतौर पर बोलते समय इसे कक्षा माना जाना चाहिए। और नहीं, उपरोक्त 'व्यक्ति' एक "फ़ंक्शन जिसका उपयोग ऑब्जेक्ट को चालू करने के लिए किया जाता है", यदि आप अधिक विशिष्ट होना चाहते हैं। दोबारा, मेरा मानना है कि हम सामान्य रूप से बोलते समय इसे कक्षा में कॉल कर सकते हैं, आप हमेशा के लिए अधिक विशिष्ट जा रहे हैं और इसे कॉल करना समाप्त कर सकते हैं ** ईसीएमए स्क्रिप्ट मेमोरी पॉइंटर को स्क्रिप्ट के लिए पार्स किया जाना चाहिए (1) कोष्ठक के माध्यम से बुलाया जा रहा है वाक्य - विन्यास। (1): नए जावास्क्रिप्ट कंपाइलर्स के मामले में निष्पादित। **। तो मुद्दा यह है कि उपर्युक्त उत्तर शब्दावली को गुमराह करने और दुरुपयोग करने के लिए नहीं है, बल्कि सरल तरीके से कुछ समझाने के लिए है। – aularon