2013-06-10 7 views
5

में अपरिभाषित है मैं ओओ जेएस लिखने के लिए काफी नया हूं, लेकिन इससे मुझे रोक दिया गया है। इसलिए मैंने मुझे नया कॉल ऑब्जेक्ट सेट किया है, फिर मुझे परिभाषित करें कि मैं खाली सरणी कहूंगा। जब मैं AddFieldQueryToArray फोन() मैंप्रोटोटाइप में परिभाषित जावास्क्रिप्ट ऐरे प्रोटोटाइप

Uncaught TypeError: Cannot call method 'push' of undefined 

पाने पर this.fieldArray.push(field)

मैं सच में पता नहीं क्यों। मैंने कन्स्ट्रक्टर में this.fieldArray = fieldArray; भी कोशिश की है।

function Call() 
    {  
     var fieldArray = new Array(); 
     var queryArray = new Array(); 
    } 

    Call.prototype.AddFieldQuerysToArray = function(field,query) 
    { 
     if(field !== 'undefined') 
     {    
      this.fieldArray.push(field); 
     } 

     this.queryArray.push(query); 

    } 
+0

बस एक टिप्पणी, जावास्क्रिप्ट में कृपया हमेशा बयान के एक ही लाइन पर ब्रेसिज़ खोलने रख:) अर्थात 'समारोह कॉल ({' 'अगर (क्षेत्र == 'अनिर्धारित'!) {'। इसका कुछ मामलों में साइड इफेक्ट्स हैं जैसे 'रिटर्न' और उचित जेएस कोड को इस फॉर्म को रखना चाहिए। –

उत्तर

10

आप this. साथ उदाहरण के गुण का उल्लेख होना चाहिए निर्माता के अंदर:

function Call() 
{  
    this.fieldArray = []; 
    this.queryArray = []; 
} 

new Array() एक शॉर्टकट [] जो मैं ऊपर का इस्तेमाल किया है है।

यदि आप var fieldArray = []; का उपयोग आप एक स्थानीय चर जो एक बार अपने उदाहरण है जब तक आप निर्माण के इस प्रकार का उपयोग बनाया गया है नष्ट हो जाता है पैदा करेगा:

function Call() 
{ 
    var fieldArray = []; 

    this.AddFieldQuerysToArray = function(field, query) { 
     // ... 
     fieldArray.push(field); 
    } 
} 

यह प्रत्येक उदाहरण है, जिसमें fieldArray है के लिए एक बंद बनाता है उदाहरण के पूरे जीवनकाल में "जीवित रखा"।

+0

"आपका उदाहरण बनने के बाद नष्ट हो गया" - जब तक कि इसे बंद करने से संदर्भित नहीं किया जाता है –

+0

@JanDvorak दिए गए कोड ने उस सुझाव को नहीं दिया है, लेकिन मैंने ऐसी स्थिति का एक उदाहरण जोड़ा है। –

+0

मैं हमेशा एक कन्स्ट्रक्टर के अंदर 'this' में विधियों को जोड़ना चाहता हूं, जैसे कि 'फ़ंक्शन कंस्ट्रर() {var env = {}; this.getEnv = फ़ंक्शन (x) {if (x) वापस env [x]; वापसी env;};} ' –

1
function Call() 
{ 
    this.fieldArray = []; 
    this.queryArray = [];  
} 


Call.prototype.AddFieldQuerysToArray = function(field,query) 
{ 
    if(field !== 'undefined') 
    { 
     alert('field==='+this.fieldArray); 
     this.fieldArray.push(field); 
    } 
    alert('field==='+this.fieldArray); 
    this.queryArray.push(query); 
alert(this.queryArray);// to check 
alert(this.fieldArray);// to check 
}; 

field = 'exampleField'; 
query = 'exampleField'; 

var cally = new Call(); 
cally.AddFieldQuerysToArray(field,query); //change 

केवल समस्या यह है कि आप Call.prototype.AddFieldQuerysToArray() विधि बुला रहे थे और यहाँ यह मान वास्तव में Call.prototype वस्तु के निष्पादन के संदर्भ में जो सरणियों fieldArray और queryArray नहीं था करने के लिए भेजा है।

cally.AddFieldQuerysToArray(field,query); कोडिंग द्वारा प्रोटोटाइप विधि AddFieldQuerysToArray() कॉलिंग cally उदाहरण है, जिसमें दोनों सरणियों अपने निर्माता के माध्यम से उस में घोषित मिल गया है के निष्पादन के संदर्भ को दर्शाता है।

+0

अलर्ट (ऑब्जेक्ट .getOwnPropertyNames (Call.prototype)); यह सरल कोड आपको यह समझने में मदद करेगा कि फ़ील्डअरे और क्वेरीअरे ऐरे वास्तव में Call.prototype के निष्पादन संदर्भ में मौजूद नहीं हैं –

0

यह बहुत पुरानी पोस्ट है & उत्तर जैक द्वारा दिया गया था। त्रुटि से बचने के लिए this का उपयोग किया जाना चाहिए।

लेकिन कोड ब्लॉक में एंटी-पैटर्न है। new Array() से बचा जाना चाहिए। बेहतर दृष्टिकोण ऐरे लिटल नोटेशन का उपयोग करना है। विवरण के लिए इस StackOverflow उत्तर What’s the difference between "Array()" and "[]" while declaring a JavaScript array? का पालन करें।

लेकिन यह बात यह है कि अगर ऐरे कन्स्ट्रक्टर को केवल एक पैरामीटर दिया जाता है तो उसे ऐरे की लंबाई के रूप में व्याख्या की जाएगी लेकिन यह सरणी में पहला तत्व नहीं होगा।

console.log(new Array(10).length);//10 
console.log(new Array(10)[0] === undefined);//true 
संबंधित मुद्दे