"वर्ग" (गुणों और विधियों के साथ) कैसे बनाएं, जिस पर बहुत सारे उदाहरण बनाए जाएंगे?जावास्क्रिप्ट में "कक्षा" को बनाने का आधुनिक तरीका क्या है?
उत्तर
Here is a basic class with explanation on how to create them.
आधुनिक तरीका के लिए, सभी नट और बोल्ट एक ही हो जाएगा। इसके बारे में कुछ भी पसंद नहीं है :)
जावास्क्रिप्ट जावा, सी ++ या इसी तरह की तरह कक्षाओं का उपयोग नहीं करता है।
अपने प्रभाव को प्राप्त करने का एक तरीका यह है कि इस कीवर्ड का उपयोग किया जाता है - सदस्यों को लगभग उतना ही एक्सेस करना जितना आप जावा में करेंगे। फिर, इस कार्य को ऑब्जेक्ट बनाने के लिए कॉल करने में नया कीवर्ड का उपयोग करें।
function Foo(){ //vaguely like a Java constructor
this.aField = 1; //define members simply by using 'this'
this.aMethod = methodFunction; //assign a function as a member using 'this'
}
function methodFunction(){
}
var foo = new Foo(); //construct an object
दृष्टिकोण उन्मुखीकरण जावास्क्रिप्ट को सबसे देशी आपत्ति उठाने का मूलरूप विरासत उपयोग करने के लिए है, लेकिन कई अन्य पैटर्न मौजूद हैं, pseudoclassical विरासत है, जो सी और जावा जैसी भाषाओं में वर्ग आधारित वंशानुक्रम स्वरूप की नकल करता भी शामिल है। डगलस क्रॉकफोर्ड ने इस विषय पर लिखा और बोली लगाई है और प्रत्येक के कुछ बहुत अच्छे स्पष्टीकरण प्रदान करता है। इन लेखों पर एक नज़र डालें:
// I like this pattern..
// class
function Person(name, birthdate) {
this._name = name;
this._birthdate = birthdate;
/* should not do this
* this.getAge = function() {
* }
* as the method will be constructed
* for each instance, better to let it
* be inherited from prototype, see below
*/
}
// class methods
Person.prototype.getBirthdate = function() {
return this._birthdate;
}
// same as above, function as a method
Person.prototype.getAge = function() {
var currentDate = new Date();
// age in millis
return currentDate - this._birthdate;
}
// the get age method can be a "static"
// method on the constructor function if you pass the
// person object
Person.getAge = function(person) {
var currentDate = new Date();
// age in millis
//no reference to this
return currentDate - person.getBirthdate();
}
// you could use it like this
myPerson = new Person("Steve", new Date("1980-01-01"));
// returns age in millis
myPerson.getAge();
// returns age in millis
Person.getAge(myPerson);
तुम भी एक गुमनाम समारोह का उपयोग अनुकरण करने के लिए कर सकता है निजी और सार्वजनिक
var PersonFactory = (function() {
// private area, no one can alter
// the person cache
var _cache = {}
// public area
return {
// returns a person born now
getPerson: function(name) {
if(_cache[name]) {
return _cache[name];
}
else {
_cache[name] = new Person(name, new Date());
return _cache[name];
}
}
}
})();
var p = PersonFactory.getPerson("Leif");
p.getAge();
p = PersonFactory.getPerson("Leif");
// should be the same age/obj
p.getAge();
मैं इस पैटर्न पसंद नहीं है हालांकि। अंडरस्कोर चेतावनी _myVariable उन चर/विधियों का उपयोग करने से आपके lib के उपयोगकर्ताओं को रखने के लिए पर्याप्त होना चाहिए। जब मैंने पहली बार जावा जावा पृष्ठभूमि की वजह से इसे खोज लिया तो मैंने इसे आवंटित किया .. यह प्रोटोटाइप विरासत के साथ काम करना मुश्किल बनाता है और मेमोरी लीक का कारण बन सकता है।
"आधुनिक" जावास्क्रिप्ट में, वस्तुओं को परिभाषित करने के लिए तीन लोकप्रिय विधियां हैं।
पहली विधि क्लासिक विधि है और इसकी सादगी के कारण अभी भी लोकप्रिय है; हालांकि, यह दूसरी विधि के पक्ष में discouraged by MDC है क्योंकि ऑब्जेक्ट का एक उदाहरण हर बार प्रत्येक फ़ंक्शन को फिर से परिभाषित करने की अक्षमता की वजह से होता है।
// Constructor, methods and members all rolled up into one definition
var Movie = function(name) {
this.name = name;
// Note that private members can be created using the closure property
var _id = +(new Date());
this.getName = function() {
return this.name + " " + _id;
};
this.setName = function(name) {
this.name = name;
};
};
var m = new Movie("Beerfest");
दूसरी विधि की एक विविधता है और पहले के लिए भी इस्तेमाल किया जा सकता। यह prototype
संपत्ति के माध्यम से मौजूदा वस्तुओं में नई विधियों को जोड़ने के लिए भी उपयोगी है। इस फ़ॉर्म में निजी सदस्य और तरीके संभव नहीं हैं।
// Constructor is separate from its methods
var Movie = function(name) {
this.name = name;
}
Movie.prototype.getName = function() {
return name;
};
Movie.prototype.setName = function(name) {
this.name = name;
};
var m = new Movie("Kill Bill");
तीसरे विधि है जो यह संभव new
ऑपरेटर का उपयोग किए बिना वस्तुओं का दृष्टांत के लिए बनाता है module pattern उपयोग करने के लिए, है।
var Movie = function (name) {
var _id = +(new Date());
var privateMethod = function() { alert(_id); };
// All methods and members defined here are public
return {
name: name,
getName: function() {
return this.name + " " + _id;
},
setName: function(name) {
this.name = name;
}
};
};
var m = Movie("Stackoverflow: the movie");
ध्यान दें कि पहले और तीसरे तरीकों में, आप निजी एक्सेस सदस्यों और विधियों का उपयोग कर सकते हैं। लेकिन ध्यान रखें कि to use this
within private methods some must happen।
अज्ञात स्व-निष्पादन फ़ंक्शन का उपयोग करके, आप सार्वजनिक और निजी विशेषताओं/विधियों के लिए अनुमति दे सकते हैं।
(function ($, MyObject, undefined) {
MyObject.publicFunction = function() {
console.log("Public function");
};
var privateFunction = function() {
console.log("Private function");
};
var privateNumber = 0;
MyObject.sayStuff = function() {
this.publicFunction();
privateFunction();
privateNumber++;
console.log(privateNumber);
};
// You can even nest the namespaces
MyObject.nestedNamespace = MyObject.nestedNamespace || {};
MyObject.nestedNamespace.logNestedMessage = function() {
console.log("Nested namespace function");
};
}(jQuery, window.MyObject = window.MyObject || {}));
MyObject.sayStuff();
MyObject.sayStuff();
MyObject.nestedNamespace.logNestedMessage();
MyObject.publicFunction();
टिप्पणी here और this article से इसके बारे में सीखा:
यह पैटर्न मुझे सबसे ज्यादा पसंद है।
- 1. स्क्रैच से एक्सएस मॉड्यूल बनाने का आधुनिक तरीका क्या है?
- 2. क्या Python में कक्षा संपत्ति बनाने का कोई तरीका है?
- 3. कक्षा सामान्य बनाने का क्या मतलब है?
- 4. जावास्क्रिप्ट क्लास बनाने का सही तरीका क्या है?
- 5. क्या जावास्क्रिप्ट लुकअप टेबल बनाने का कोई आसान तरीका है?
- 6. क्या सरलजसन को कम सख्त बनाने का कोई तरीका है?
- 7. मूस में कक्षा विशेषता बनाने का सबसे अच्छा तरीका क्या है?
- 8. क्या आईपैड सिम्युलेटर को बड़ा बनाने का कोई तरीका है?
- 9. क्या एक्जिक्यूटर्स सर्विस को रिकर्सिवली बनाने का कोई तरीका है?
- 10. इस लेआउट को बनाने का एक उचित तरीका क्या है?
- 11. क्या टीएफएस को जोड़ने योग्य बनाने का कोई तरीका है?
- 12. क्या "रेक मार्ग" को बेहतर बनाने का कोई तरीका है?
- 13. जावास्क्रिप्ट में क्लास गेटर/सेटर्स बनाने का सबसे अच्छा तरीका?
- 14. इंकस्केप में तीर बनाने का सबसे अच्छा तरीका क्या है?
- 15. क्या आपका अपना HTML तत्व बनाने का कोई तरीका है?
- 16. क्या Emacs में "प्रोजेक्ट फ़ाइल" बनाने का कोई तरीका है?
- 17. क्या सी में कार्य परमाणु बनाने का कोई तरीका है? ।
- 18. जावा में कोई तारीख बनाने का सही तरीका क्या है?
- 19. क्या सी # में अनाम structs बनाने का कोई तरीका है?
- 20. जावास्क्रिप्ट: कक्षा का नाम
- 21. क्या जीडब्ल्यूटी में जावास्क्रिप्ट की चेतावनी के समान कुछ बनाने का कोई तरीका है?
- 22. क्या क्रोम में जावास्क्रिप्ट बनाने और चलाने का कोई तरीका है?
- 23. एक उद्देश्य-सी कक्षा के अपरिवर्तनीय और परिवर्तनीय संस्करण बनाने का सबसे प्रभावी तरीका क्या है?
- 24. फ्लोटेड सामग्री को साफ़ करने का आधुनिक तरीका?
- 25. कक्षा में @param का क्या अर्थ है?
- 26. Backbone.js प्रोजेक्ट बनाने का एक अच्छा तरीका क्या है?
- 27. तुलना ऑपरेटर को एक चर बनाने का कोई तरीका है?
- 28. जावास्क्रिप्ट टैग को प्रारूपित करने का सही तरीका क्या है?
- 29. जावास्क्रिप्ट में कक्षाएं बनाने के लिए सही तरीका?
- 30. जावास्क्रिप्ट को शामिल करने का सबसे अच्छा तरीका क्या है?
विधि असाइनमेंट को ठीक किया गया; आशा है कि आपको बुरा लगेगा ... – Christoph
जब तक आप एक से अधिक कक्षा में 'विधि फ़ंक्शन' का उपयोग नहीं कर रहे हैं, तो इसे 'एफ' के बाहर परिभाषित करने से वैश्विक क्षेत्र को प्रदूषित करने के अलावा कोई वास्तविक उद्देश्य नहीं मिलता है। –
@ जस्टिन: कन्स्ट्रक्टर के बाहर 'विधि फ़ंक्शन() 'को परिभाषित करना सबसे निश्चित रूप से एक वास्तविक उद्देश्य प्रदान करता है: अन्यथा, प्रत्येक उदाहरण के लिए एक नया फ़ंक्शन ऑब्जेक्ट बनाया जाना चाहिए (यानी' एफ 'की संख्या में' ओ (एन) 'ओवरहेड वस्तुओं); आम तौर पर, मैं 'f.prototype' विधि को असाइन करता हूं, लेकिन ऐसा करने से विधि लुकअप – Christoph