2010-07-19 27 views
11

आप जावास्क्रिप्ट में "कक्षाएं" कैसे बनाते हैं ??आप जावास्क्रिप्ट में कक्षाएं कैसे बनाते हैं?

मैं उपयोग कर रहा हूँ:

function classFoo() 
{ 
    var classLevelVariable = 0; 

    this.classFunction = function() 
    { 
     alert("The classFunction has been called."); 
     classFunction2(); //Crash. classFunction2 is "undefined." 
    } 

    this.classFunction2 = function() 
    { 
     alert("classFunction2 called."); 
    } 
} 

मैं था कंस्ट्रक्टर्स काम करने के लिए प्राप्त करने में सक्षम नहीं है। कोशिश की गई

this.New = function(arguments) 

जो एक बार काम करता था, लेकिन दूसरी कक्षा में नहीं। इसलिए, अब मैंने अपने स्वयं के "प्रारंभिक" कार्यों का उपयोग करके उन पर पूरी तरह से त्याग दिया है जो रचनाकारों के रूप में कार्य करते हैं।

इसके साथ अजीबता एक बार काम कर रही है, लेकिन दो बार नहीं, मुझे दो वर्गों के बीच टाइपोग्राफ़िकल त्रुटियां लगता है ... लेकिन मुझे लगता है कि कोडिंग के 1 9 साल में, शायद यह नहीं है।

मैं क्रोम के डीबगर का उपयोग कर रहा हूं, और मुझे कॉल होने पर दूसरे कार्य को अपरिभाषित किए जाने के अलावा कोई त्रुटि नहीं मिल रही है।

+0

इस प्रश्न के साथ कुछ भी गलत नहीं है, यह मुझे आश्चर्य करता है कि लोग एच आपको पहले से ही कई वोट दिए गए हैं। –

+1

@ जॉन: संपादन इतिहास की समीक्षा करें। मुझे उम्मीद है कि मैंने इसे उचित बनाने के लिए पर्याप्त रूप से प्रश्न संपादित किया है। –

+3

आप 'classFooction()' की विधि नहीं होने पर 'classFunction2()' को कॉल नहीं कर सकते हैं, यदि आपके अंदर 'class.ooassFunction2() 'है, तो आपके अंदर' classFoo()'। – qw3n

उत्तर

4

जावास्क्रिप्ट एक प्रोटोटाइप आधारित प्रोग्रामिंग भाषा है। कक्षा की अवधारणा मौजूद नहीं है या कक्षा की अवधारणा एक वस्तु के समान है। जावा प्रोग्रामिंग भाषा कहने से यह काफी अलग है। अपने नामों से मूर्ख मत बनो, सिमिलरीज वहां खत्म हो जाते हैं।

मैंने वापस this question मुझसे पूछा। मुझे जॉन रेसिग द्वारा these presentation slides के अच्छे लिंक के साथ एक जवाब मिला। हालांकि देखो और देखें कि क्या यह जावास्क्रिप्ट और प्रोटोटाइप श्रृंखलाओं को समझने में मदद करता है।

7

जावास्क्रिप्ट क्लास-आधारित विरासत का उपयोग नहीं करता है। इसलिए, आप जावास्क्रिप्ट में कक्षाएं नहीं बना सकते हैं, उन्हें workarounds का उपयोग करके अनुकरण करने के अलावा, जो IMHO बेकार और जटिल हैं।

जावास्क्रिप्ट एक प्रोटोटाइप भाषा है। new कीवर्ड का उपयोग कन्स्ट्रक्टर ऑब्जेक्ट की प्रोटोटाइप प्रॉपर्टी के आधार पर एक नई वस्तु बनाता है।

आप एक विचार है कि कैसे आप मूलरूप विरासत का उपयोग कर सकते एक नया एक मूलरूप वस्तु यहां के आधार पर वस्तु का दृष्टांत को प्राप्त कर सकते हैं: http://javascript.crockford.com/prototypal.html

+1

जावास्क्रिप्ट प्रोटोटाइप-आधारित प्रोग्रामिंग है। ऑब्जेक्ट उन्मुख प्रोग्रामिंग की एक शैली जिसमें कक्षाएं मौजूद नहीं हैं, और व्यवहार पुन: उपयोग (कक्षा-आधारित भाषाओं में विरासत के रूप में जाना जाता है) प्रोटोटाइप के रूप में कार्य करने वाली मौजूदा वस्तुओं को क्लोन करने की प्रक्रिया के माध्यम से किया जाता है। प्रोटोटाइप-आधारित प्रोग्रामिंग (http://en.wikipedia.org/wiki/Prototype-based_programming) - कक्षा-आधारित प्रोग्रामिंग (http://en.wikipedia.org/wiki/Class-based_programming) –

2

Here जावास्क्रिप्ट में ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग के बारे में sitepoint.com पर एक अच्छा लेख है।

Thisjavascriptkit.com पर एक और अधिक सरल है।

आप बनाता है के लिए एक वस्तु उसके गुण और कार्य इस तरह से सेट एक समारोह का उपयोग कर सकते हैं:

person = new Object() 
person.name = "Tim Scarfe" 
person.height = "6Ft" 

person.run = function() { 
    this.state = "running" 
    this.speed = "4ms^-1" 
} 

या उपयोग कंस्ट्रक्टर्स:

function person(name,height,speed){ 
    this.name = name; 
    this.height = height; 
    this.speed = speed; 
} 

var p1=new person('tom', '6ft','15kmph'); 

alert(p1.height); 

या आप वस्तुओं का विस्तार करने के प्रोटोटाइप का उपयोग कर सकते हैं:

person.prototype.sayHello = function(){alert("Hi, I'm " + name;} 

var p2 = new person('sam', '5.9ft', '12kmph'); 
p2.sayHello();//alert-> Hi, I'm sam 

अधिक गहन विवरण लिंक किए गए पृष्ठों पर हैं।

-2

प्रोटोटाइप जावास्क्रिप्ट ढांचे का उपयोग करके।

+2

वाह कूल, मैन !! ! – TheVillageIdiot

+1

आप प्रोटोटाइप जेएस लाइब्रेरी (http://www.prototypejs.org/) को सामान्य प्रोटोटाइप विरासत सिद्धांतों (अन्यत्र उल्लिखित)/प्रोटोटाइप जेएस कीवर्ड के साथ भ्रमित कर रहे हैं। –

6

मुझे लगता है कि आपका मूल राग (प्रश्न का संशोधन इतिहास देखें) एक प्रतिक्रिया का हकदार है।प्रोग्रामिंग और कंप्यूटर विज्ञान की भावना के खिलाफ यह बहुत अधिक है, मेरी राय में, केवल एक भाषा को घोषित करने के लिए क्योंकि आप make it go नहीं कर सकते हैं।

अगर मुझे लगता है कि मैं आपको परेशान करता हूं तो मुझे क्षमा करें कि मुझे आश्चर्य है कि वे इस तरह की प्रतिमानी अज्ञानता वाले लोगों को सीएस डिग्री दे सकते हैं। जब मैं स्कूल गया, जो लगभग 5 साल पहले था, मैंने 6 अलग-अलग भाषाओं में अपनी नियुक्तियां की: एमआईपीएस, वेरिलोग, स्कीम, जावा, सी/सी ++ और पायथन। हमने कई प्रतिमानों का उपयोग किया, जिनमें कार्यात्मक और ओओपी लेकिन अन्य शैलियों भी शामिल थे। यदि आप इन अलग-अलग दृष्टिकोणों से अवगत नहीं थे, जिनमें से कोई भी नया नहीं है, आपकी शिक्षा पूरी नहीं हुई है।

क्या यह आपके लिए हुआ है कि आप कैननिकल ओओपी मानते हैं ओओपी सिद्धांतों का केवल एक फॉर्मूलेशन है? जावास्क्रिप्ट ऑब्जेक्ट्स में "प्रोटोटाइप" से तत्काल होता है, और यह कक्षा के समान नहीं है। जब आप कक्षा-आधारित ओओपी भाषा की तरह काम करने की अपेक्षा करते हैं, तो यह आपकी अपेक्षाओं को पूरा नहीं करेगा। जावा और सी ++ ओओपी के स्वर्ण मानक नहीं हैं, न ही ओओपी बी-ऑल-एंड-प्रोग्रामिंग के सभी हैं।

एक लगता होगा हम अपनी तरफ से पूरी लागू होगा:

जब एक शानदार एप्लिकेशन कि जावास्क्रिप्ट में पिछले 3-5 वर्षों में लिखा गया है समझता है, यह है कि एक व्यक्ति इस तरह एक बयान कर सकते हैं अद्भुत है पिछले छह दशकों में कोडिंग प्रथाओं में। नहीं बिलकुल नहीं। हमारे पास क्या है? कार्यों के अंदर कार्य ... कक्षाओं के कुछ अजीब bastardization। कोई स्थिरता के साथ पूर्ण करें ...

कहना है कि करने के लिए, प्रतिभाशाली जावास्क्रिप्ट डेवलपर्स की टीमों द्वारा किए गए शानदार उपलब्धियों के बावजूद, भाषा, क्योंकि आप इसे समझने में कठिनाई होती है टूट गया है अच्छी तरह से, है, आश्चर्यजनक।

कृपया विचार करें कि, भाषा की त्रुटिपूर्ण होने के बजाय, वर्तमान में आप इसे समझने के लिए आवश्यक परिप्रेक्ष्य नहीं रख सकते हैं।


पीएस, आपने बताया है कि आप "फ्लैश से बचने के लिए जावास्क्रिप्ट का उपयोग कर रहे हैं!" ऐसा लगता है कि आपके पास तथ्यों का पता लगाने के लिए बहुत ही खराब रणनीति है, क्योंकि जावास्क्रिप्ट और एक्शनस्क्रिप्ट दोनों एक ही spec को लागू करते हैं: ECMAScript।

+0

हाँ, बहस! यही वह है जो मैंने मांगा था। :- डी यह सच है कि मेरे कंप्यूटर विज्ञान शिक्षा और कार्य अनुभव का सी ++, .NET, और जावा का प्रभुत्व रहा है, जो निश्चित रूप से मुझे पूर्वाग्रह बनाता है। पिछले कुछ सालों में, मुझे बहुत सारे फ्लैश काम करना पड़ा, जो मुझे बहुत निराशाजनक लगता है, क्योंकि अधिकांश भाषा दो दुनिया के बीच "आधा रास्ता" प्रतीत होती है। जबकि इसमें कक्षाएं हैं, उनके पास कई हिचकी हैं।सबसे डरावना एक मैंने पाया यह कभी कभी भ्रामक संदर्भ है, तो आप इस तरह के रूप गंदा चाल का उपयोग करने की आवश्यकता होती है: – JKZ

+0

वर्ग MyClass { समारोह TryingToCall() { } समारोह फू() { // इस। TryingToCall(); विफल रहता है। कोशिश कर रहा है TryingToCall मौजूद नहीं है। var me: MyClass = this; me.TryingToCall(); // काम करता है। } } – JKZ

+0

जावास्क्रिप्ट के साथ, मुझे इसी तरह की निराशा होती है, इसलिए मैंने एक विशाल रान लिखा :-)। हम सब जानते हैं कि महसूस हो रहा है ... महसूस कर रहा है कि आप जानते हैं कि आप कुछ "गंदे" कर रहे हैं, लेकिन आपको इसे बिल्कुल काम करने के लिए करना है। मुझे जावास्क्रिप्ट में सरल चीजें करने में लग रहा है: -पी। – JKZ

1

जावास्क्रिप्ट Prototyping Language है, इसलिए चीजें थोड़ा अलग हैं।

यहाँ समझाने के लिए एक कोड का टुकड़ा है:

(function(){ // create an isolated scope 
    // My Object we created directly 
    var myObject = { 
     a: function(x,y) { 
      console.log('a'); 
     }, 
     b: function(x,y) { 
      console.log('b'); 
      this.a(x,y); 
     } 
    }; 
})(); 

(function(){ // create an isolated scope 

    // Create a Object by using a Class + Constructor 
    var myClass = function(x,y) { 
     console.log('myClass: constructor'); 
     this.b(x,y); 
    }; 
    myClass.prototype = { 
     a: function(x,y) { 
      console.log('myClass: a'); 
     }, 
     b: function(x,y) { 
      console.log('myClass: b'); 
      this.a(x,y); 
     } 
    }; 

    // Define a function that should never inherit 
    myClass.c = function(x,y) { 
     console.log('myClass: c'); 
     this.a(x,y); 
    }; 

    // Create Object from Class 
    var myObject = new myClass(); 
    // Will output: 
    // myClass: constructor 
    // myClass: b 
    // myClass: a 

    // Define a function that should never inherit 
    myObject.d = function(x,y) { 
     console.log('myObject: d'); 
     this.a(x,y); 
    }; 

    // Test the world is roung 
    console.log(typeof myClass.c, 'should be undefined...'); 
    console.log(typeof myClass.d, 'should be function...'); 
})(); 

(function(){ // create an isolated scope 
    // If you are using a framework like jQuery, you can obtain inheritance like so 

    // Create a Object by using a Class + Constructor 
    var myClass = function(x,y) { 
     console.log('myClass: constructor'); 
     this.b(x,y); 
    }; 
    myClass.prototype = { 
     a: function(x,y) { 
      console.log('myClass: a'); 
     }, 
     b: function(x,y) { 
      console.log('myClass: b'); 
      this.a(x,y); 
     } 
    }; 

    // Create new Class that inherits 
    var myOtherClass = function(x,y) { 
     console.log('myOtherClass: constructor'); 
     this.b(x,y); 
    }; 
    $.extend(myOtherClass.prototype, myClass.prototype, { 
     b: function(x,y) { 
      console.log('myOtherClass: b'); 
      this.a(x,y); 
     } 
    }); 

    // Create Object from Class 
    var myOtherObject = new myOtherClass(); 
    // Will output: 
    // myOtherClass: constructor 
    // myOtherClass: b 
    // myClass: a 
})(); 

(function(){ // create an isolated scope 
    // Prototypes are useful for extending existing classes for the future 
    // Such that you can add methods and variables to say the String class 
    // To obtain more functionality 
    String.prototype.alert = function(){ 
     alert(this); 
    }; 
    "Hello, this will be alerted.".alert(); 
    // Will alert: 
    // Hello, this will be alerted. 
})(); 

वहाँ पुस्तकालयों इस तरह के रूप में के साथ मदद करने के लिए कर रहे हैं:

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