2010-09-04 11 views
21

मैं जावास्क्रिप्ट में क्लास चर घोषित कैसे करूं।क्लास वेरिएबल जावास्क्रिप्ट

function Person(){ 
    fname = "thisfname"; //What needs to be put here 
} 
alert(Person.fname) //It should alert "thisFrame" 

मैं इस दृष्टिकोण का उपयोग नहीं करना चाहता।

function Person(){ 

} 
Person.fname = "thisfname"; 
alert(Person.fname) //alerts "thisframe" 

उत्तर

9

जिस तरह से आप का उल्लेख कैसे वर्ग चर अन्य तरीके से परिभाषित करने के लिए, (function Person अंदर) है उदाहरण के गुण को परिभाषित करने के लिए है।

function Person(name){ 
    this.name = name; 
} 
Person.specie = "Human"; 

alert(Person.specie) //alerts "Human", a class variable. 

var john = new Person('John'); 
alert(john.name); //alerts "John", an object property. 
+0

क्यों downvote? –

+0

'व्यक्ति' कक्षा नहीं है, जावास्क्रिप्ट में कक्षा की तरह कुछ भी नहीं है। जावास्क्रिप्ट में 'प्रोटोटाइप विरासत' के साथ ऑब्जेक्ट्स हैं, लेकिन 'व्यक्ति' इस मामले में केवल एक ऑब्जेक्ट है, इसमें एक विधि भी नहीं है, यह केवल एक हैश मैप/डिक्शनरी है जिसे आप इसे कॉल करना चाहते हैं। कुछ अच्छे स्पष्टीकरण के लिए नीचे बीजीरिसन का उत्तर देखें। –

+5

@Ivo आमतौर पर बोलते समय इसे कक्षा माना जाना चाहिए। और नहीं, उपरोक्त 'व्यक्ति' एक "फ़ंक्शन जिसका उपयोग ऑब्जेक्ट को चालू करने के लिए किया जाता है", यदि आप अधिक विशिष्ट होना चाहते हैं। दोबारा, मेरा मानना ​​है कि हम सामान्य रूप से बोलते समय इसे कक्षा में कॉल कर सकते हैं, आप हमेशा के लिए अधिक विशिष्ट जा रहे हैं और इसे कॉल करना समाप्त कर सकते हैं ** ईसीएमए स्क्रिप्ट मेमोरी पॉइंटर को स्क्रिप्ट के लिए पार्स किया जाना चाहिए (1) कोष्ठक के माध्यम से बुलाया जा रहा है वाक्य - विन्यास। (1): नए जावास्क्रिप्ट कंपाइलर्स के मामले में निष्पादित। **। तो मुद्दा यह है कि उपर्युक्त उत्तर शब्दावली को गुमराह करने और दुरुपयोग करने के लिए नहीं है, बल्कि सरल तरीके से कुछ समझाने के लिए है। – aularon

0
function Person(){ 
    this.fname = null; 
    this.lname = null; 
    this.set_fname = set_fname; 
    this.set_lname = set_lname; 
    this.get_name = get_name; 
} 
/* Another way 
function Person(fname, lname){ 
    this.fname = fname; 
    this.lname = lname; 
    this.get_name = get_name; 
}*/ 
function set_fname(fname){ 
    this.fname = fname; 
} 
function set_lname(y){ 
    this.lname = lname; 
} 
function get_name(){ 
    with (this) { 
     return fname + ' ' + lname; 
    } 
} 

person_obj = new Person(); 
person_obj.set_fname('Foo'); 
person_obj.set_lname('Bar'); 

// person_obj = new Person('Foo', 'Bar'); 

person_obj = get_name(); // returns "Foo Bar" 

बेहतर उदाहरण के बारे में सोच नहीं सकता। जावास्क्रिप्ट वर्ग के लिए एक चर निर्धारित करने

+0

'फ़ंक्शन व्यक्ति (fname, lname)' को परिभाषित करने से 'फ़ंक्शन व्यक्ति() 'की परिभाषा को ओवरराइट कर दिया जाएगा, यह जावास्क्रिप्ट में फ़ंक्शन ओवरलोडिंग करने का तरीका नहीं है। – aularon

+0

महोदय, मैं अधिभार का इरादा नहीं था। वे विकल्प हैं। मुझे जवाब संपादित करने दें। – simplyharsh

+1

यह वास्तव में एक बुरा उदाहरण है, क्या आपने कभी प्रोटोटाइप के बारे में सुना है? :/साथ ही 'साथ' का उपयोग क्रॉकफ़ोर्ड और अन्य द्वारा हानिकारक माना जाता है, यदि ऑब्जेक्ट पर 'with' caluse में मौजूद संपत्ति मौजूद नहीं है तो आप इसके बजाय वैश्विक चर सेट करेंगे। –

0

3 तरीके:

1) गुण परिभाषित करने के लिए समारोह() का उपयोग कर, आप 'इस' कीवर्ड

function Apple (type) { 
    this.type = type; 
    this.color = "red"; 
} 

का उपयोग एप्पल की एक वस्तु का दृष्टांत के लिए बनाई गई वर्ग, कुछ गुण सेट आप निम्न कर सकते हैं:

var apple = new Apple('macintosh'); 
apple.color = "reddish"; 

2) का उपयोग करते हुए शाब्दिक संकेतन

वर सेब = {
प्रकार: "Macintosh",
का रंग: "लाल"

}

इस मामले में आप (और नहीं कर सकते हैं) की जरूरत नहीं है एक उदाहरण बनाने कक्षा के, यह पहले से मौजूद है।

apple.color = "reddish"; 

3) सिंगलटन एक समारोह का उपयोग कर

var apple = new function() { 
    this.type = "macintosh"; 
    this.color = "red"; 
} 

तो आप देखते हैं कि यह बहुत ही 1 ऊपर चर्चा के समान है, लेकिन जिस तरह से वस्तु का उपयोग करने के बिल्कुल में की तरह है 2.

apple.color = "reddish"; 
+2

यह JSON नहीं है, हालांकि ऐसा लगता है। ECMAScript को ऑब्जेक्ट शाब्दिक वाक्यविन्यास के लिए समर्थन मिला था क्योंकि इसे बनाया गया था। एक ऑब्जेक्ट शाब्दिक जेएसओएन स्पेक की तुलना में बहुत अधिक समर्थन करता है (फ़ंक्शन वैल्यू, निर्मित और टाइप की गई वस्तुओं सहित, लेकिन इतनी ही सीमित नहीं है, और अनगिनत पैरामीटर नाम [जैसे आपने उपयोग किया]]। – eyelidlessness

+0

इसे मेरे नोटिस में लाने के लिए धन्यवाद .. :) –

3

यह समझना महत्वपूर्ण है कि जावास्क्रिप्ट में कक्षाओं जैसी कोई चीज़ नहीं है। वहाँ कुछ ढांचे हैं जो एक शास्त्रीय विरासत पैटर्न अनुकरण करते हैं, लेकिन तकनीकी रूप से यह सब constructor functions and prototypes तक उबाल जाता है।

Person.prototype = PersonProto; 

और, देखा:

var a = new Person(); 
alert(a.fname); 
35

जावास्क्रिप्ट नहीं है

तो, आप

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!"' 

इसे क्यों पसंद किया जाना चाहिए?क्योंकि यह आपके ऑब्जेक्ट्स को मिनट और पठनीय रखता है, यहां तक ​​कि प्रोटोटाइपिकल संदर्भ मेमोरी लेते हैं और विरासत और 'सबक्लासिंग' का उपयोग करते समय आप उन बच्चों के उदाहरणों के साथ समाप्त होते हैं जिनमें बहुत से अप्रयुक्त विधि संदर्भ होते हैं। प्रतिनिधि हमेशा बेहतर होता है।

+0

+1 यह। अधिकांश अन्य उत्तर सिर्फ 'कक्षा' शब्द के उपयोग से उलझन में हैं। –

+0

@ बीजीरिसन: आपके पास अपने हाथों पर बहुत अधिक समय होना चाहिए;) मैं आपके उत्तर के अंतिम भाग से असहमत हूं। एक ऑब्जेक्ट * हमेशा * के प्रोटोटाइप का संदर्भ होता है, इसलिए आप प्रतिनिधिमंडल का उपयोग करके कुछ भी नहीं जीत पाएंगे। ऑब्जेक्ट्स प्रोटोटाइप के सदस्यों के संदर्भों का वारिस नहीं करते हैं; वे गतिशील रनटाइम रिज़ॉल्यूशन का उपयोग करते हैं (जो विरासत विधियों को विस्तार या बदलने के लिए एक अच्छी बात है) – user123444555621

+0

@ Pumbaa80 इसे कुछ और विचार दें;) – BGerrissen

0

तुम भी इस तरीके का प्रयास कर सकते हैं:

 function name(){ 
      this.name; 
      this.lastname; 
     } 
     name.prototype.firstName=function(name){ 
      this.name = name; 
      alert(this.name); 

     } 
     var x = new name(); 
     x.firstName("Kartikeya"); 
संबंधित मुद्दे