2013-06-10 9 views
5

undefined ich bin ziemlich neu zu OO JS schreiben, aber das hat mich ratlos. Also habe ich mir ein neues Call-Objekt eingerichtet und dann definiert, was ich für leere Arrays halte. Als ich AddFieldQueryToArray() aufrufen, ichJavascript Array im Konstruktor definiert ist in Prototyp

Uncaught TypeError: Cannot call method 'push' of undefined 

Auf this.fieldArray.push(field)

Ich weiß nicht wirklich, warum. Ich habe this.fieldArray = fieldArray; im Konstruktor auch versucht.

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

Nur ein Kommentar, in JavaScript pls immer Klammern auf der gleichen Linie der Erklärung setzen Öffnen: d 'Funktionsaufruf() {', 'if (Feld == 'undefined'!) {'. Dies hat in einigen Fällen Nebenwirkungen, wie zum Beispiel mit return, und ein richtiger JS-Code sollte diese Form behalten. –

Antwort

10

Sie sollten Instanzeigenschaften mit this. innerhalb des Konstruktors Referenz:

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

new Array() hat eine Verknüpfung [] die ich oben verwendet haben.

Wenn Sie var fieldArray = []; würden Sie eine lokale Variable erstellen, die zerstört wird, sobald die Instanz erstellt wurde, wenn Sie diese Art von Konstrukt verwenden:

function Call() 
{ 
    var fieldArray = []; 

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

Diese für jede Instanz einen Verschluss schafft, in dem fieldArray ist "Lebendig gehalten" während der gesamten Lebenszeit der Instanz.

+0

"zerstört, sobald Ihre Instanz erstellt wurde" - es sei denn, es wird von einer Schließung referenziert –

+0

@JanDvorak Der angegebene Code gab diesen Vorschlag nicht, aber ich habe ein Beispiel für eine solche Bedingung hinzugefügt. –

+0

Ich finde immer das Hinzufügen von Methoden zu "this" innerhalb eines Konstruktors sieht hässlich aus, mit Ausnahme von etwas wie 'function Constr() {var env = {}; this.getEnv = Funktion (x) {if (x) Rückgabe env [x]; Rückgabe 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 

Das einzige Problem ist, dass Sie Call.prototype.AddFieldQuerysToArray() Verfahren und hier, um diesen Wert tatsächlich bezeichnete Ausführungskontext von Call.prototype Objekt fordern, die nicht die Arrays fieldArray und queryArray haben.

Aufruf der Methode AddFieldQuerysToArray() Prototyps durch cally.AddFieldQuerysToArray(field,query); Codierung bezieht sich auf den Ausführungskontext des cally Instanz, die sowohl die deklarierten Arrays in sie durch den Konstruktor bekommen hat.

+0

Warnung (Object.getOwnPropertyNames (Call.prototype)); Dieser einfache Code hilft Ihnen zu verstehen, dass fieldArray- und queryArray-Arrays im Ausführungskontext von Call.prototype nicht vorhanden sind –

0

Es ist eine sehr ältere Post & die Antwort wurde von Jack gegeben. this muss verwendet werden, um den Fehler zu vermeiden.

Aber es ist ein Anti-Muster im Codeblock verwendet. new Array() sollte vermieden werden. Besserer Ansatz ist Array Array Literal Notation. Befolgen Sie diese StackOverflow-Antwort What’s the difference between "Array()" and "[]" while declaring a JavaScript array? für Details.

Aber das Wesentliche ist, dass, wenn nur ein Parameter an den Array-Konstruktor gegeben wird, dann wird dies als Länge des Array interpretiert, aber das wird nicht das erste Element im Array sein.

console.log(new Array(10).length);//10 
console.log(new Array(10)[0] === undefined);//true 
Verwandte Themen