2016-06-25 11 views
-1

Kann mir jemand das erklären?Javascript Objekte und variabler Bereich

Dies funktioniert:

function Pin() { }; 
function Pi() { }; 
function User() { }; 

var PiArray = []; 
var PinArray; 

for (var i = 0; i < 2; i++) { 
    PiArray[i] = new Pi(); 
    PiArray[i].Name = ''; 
    PiArray[i].PinArray = []; 
    for (var j = 0; j < 25; j++) { 
     PiArray[i].PinArray[j] = new Pin(); 
     PiArray[i].PinArray[j].Number = j + 2; 
     PiArray[i].PinArray[j].PulseWidth = 0; 
     PiArray[i].PinArray[j].PulseFrenquency = 0; 
     PiArray[i].PinArray[j].Dirtybit = false; 
    }; 
} 

/* Output is 

[{"Name":"","PinArray":[{"Number":2,"PulseWidth":0,"PulseFrenquency":0,"Dirtybit":false},{"Number":3,"PulseWidth":0,"PulseFrenquency":0,"Dirtybit":false},{"Number":4,"PulseWidth":0,"PulseFrenquency":0,"Dirtybit":false}, 

etc. 

*/ 

Aber ich kann nicht herausfinden, wie diese in ein Objekt zu machen, den Umfang der Variablen verhalten sich nicht wie ich erwartet.

Dies ist, was ein Beispiel dessen, was ich versucht:

function Pin() { }; 

function Pi() { }; 

var User = (function() { 

    PiArray = []; 

    function User() { 
     var PinArray; 
     for (var i = 0; i < 2; i++) { 
      PiArray[i]= new Pi(); 
      PiArray[i].Name = ''; 
      PiArray[i].PinArray = []; 
      for (var j = 0; j < 25; j++) { 
       PiArray[i].PinArray[j] = new Pin(); 
       PiArray[i].PinArray[j].Number = j + 2; 
       PiArray[i].PinArray[j].PulseWidth = 0; 
       PiArray[i].PinArray[j].PulseFrenquency = 0; 
       PiArray[i].PinArray[j].Dirtybit = false; 
      }; 
     } 
    } 

    console.log(JSON.stringify(PiArray)); 
    return User; 
})(); 

new User(); 

und der Ausgang ist:

[ ] 

Ich verstehe nicht, warum?

+2

___unclear was Sie asking___ – Rayon

+0

sind Es könnte helfen, zu wissen, was Sie erwarten zu sehen, und warum. –

+0

Abhängig von der Antwort kann die Umgebung, in der Sie das ausführen (z. B. Rhino, Node oder ein Browser-Debugger), ebenfalls relevant sein. –

Antwort

3

Ihre console.log(JSON.stringify(PiArray)); zeigt ein leeres Array im zweiten Fall, weil es zum Zeitpunkt der Ausführung noch nicht die Funktion aufgerufen hat. Das IIFE definiert nur die Funktion und gibt sie dann zurück. Es nennt es nicht wirklich.

Ihr später Code new User() ruft es, aber das ist, nachdem Ihre console.log() bereits ausgeführt wurde.

Verschieben Sie die console.log() an das Ende Ihrer Funktionsdefinition (aber innerhalb der Funktion) und Sie werden den erwarteten Wert sehen.

function Pin() { }; 

function Pi() { }; 

var User = (function() { 

    PiArray = []; 

    function User() { 
     var PinArray; 
     for (var i = 0; i < 2; i++) { 
      PiArray[i]= new Pi(); 
      PiArray[i].Name = ''; 
      PiArray[i].PinArray = []; 
      for (var j = 0; j < 25; j++) { 
       PiArray[i].PinArray[j] = new Pin(); 
       PiArray[i].PinArray[j].Number = j + 2; 
       PiArray[i].PinArray[j].PulseWidth = 0; 
       PiArray[i].PinArray[j].PulseFrenquency = 0; 
       PiArray[i].PinArray[j].Dirtybit = false; 
      }; 
     } 
     console.log(JSON.stringify(PiArray)); 
    } 

    return User; 
})(); 

new User(); 

FYI, ist es unklar, was Sie versuchen, mit dieser Struktur zu erreichen, weil PiArray nur erreichbar von Ihrem Konstruktor ist. Sobald der Konstruktor aufgerufen wurde, kann kein anderer Code ihn erreichen oder verwenden. Plus alle Aufrufe an den Konstruktor werden die gleichen PiArray ändern. PiArray in diesem Kontext funktioniert wie eine Klasse statisch (wie der Begriff in anderen Sprachen verwendet wird). Es ist eine allgemeine Variable, die von allen Instanzen der Klasse gemeinsam genutzt wird, aber außerhalb des Codes für das Objekt selbst nicht zugänglich ist.

Wenn Sie andere Methoden auf dem User-Objekt hatten, könnten sie auch auf PiArray zugreifen, und es könnte sinnvoller sein, es zu haben.


Sie können eine Instanz erstellen, die eine andere Anordnung in es so gespeichert hat:

var MyObj = function(data) { 
    // assign a copy of the passed-in array as instance data 
    // You don't have to make a copy - you could just assign in incoming array 
    this.data = data.slice(0); 
} 

var x = new MyObj([1,2,3]); 
var y = new MyObj([9,8,7]); 
console.log(x.data); // [1,2,3] 
console.log(y.data); // [9,8,7] 
+0

Mal sehen, ob ich erklären kann, was ich erreichen will. Ich denke, du hast einen Teil meiner Frage beantwortet. Ich versuche eine Klasse in JavaScript zu installieren. Und was ich gefunden habe, ist genau das, was du gesagt hast, es sah wie eine statische Klasse aus. Ich möchte Instanzen einer Klasse haben, damit die Werte unterschiedlich sind. Kann es in JavaScript gemacht werden? –

+0

Ich habe ein Objekt mit einem Array von Objekten, das ein Array von Objekten hat. Und ich möchte verschiedenen Instanzen unterschiedliche Werte zuweisen. Ich kann das tun ist C#, aber ich weiß nicht, ob ich das in JavaScript tun kann. –

+0

@MarioRosario - Ich habe am Ende meiner Antwort ein Beispiel hinzugefügt, um ein Objekt zu erstellen, bei dem jede Instanz in ihren Instanzdaten ein anderes Array hat. – jfriend00