2016-06-25 8 views
-1

Может кто-нибудь объяснить это мне?Javascript Объекты и область видимости

Это работает:

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. 

*/ 

Но я не могу понять, как сделать это в объект, область переменных не ведут себя, как я ожидал.

это то, что пример того, что я пробовал:

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(); 

и выход:

[ ] 

Я не понимаю, почему?

+2

___unclear что вы asking___ – Rayon

+0

Это может помочь узнать, что вы ожидаете увидеть, и почему. –

+0

В зависимости от ответа может быть актуальной среда, в которой вы используете это (например, носорог, узел или отладчик браузера). –

ответ

3

Ваш console.log(JSON.stringify(PiArray)); показывает пустой массив во втором случае, потому что в момент его запуска вы еще не вызвали функцию User(). IIFE только определяет функцию User(), а затем возвращает ее. На самом деле это не называется.

Ваш более поздний код new User() действительно вызывает это, но это после того, как ваш console.log() уже выполнен.

Переместите console.log() в конец вашего определения функции User() (но внутри функции), и вы увидите ожидаемое значение.

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, то неясно, что вы пытаетесь достичь с этой структурой, поскольку PiArray только достижимые из вашего конструктора. Как только конструктор был вызван, ни один другой код не может связаться с ним или использовать его. Плюс все вызовы конструктора будут изменять то же самое PiArray. PiArray в этом контексте работает как класс static (поскольку этот термин используется на других языках). Это общая переменная, разделяемая всеми экземплярами класса, но не доступная вне кода для самого объекта.

Если у вас были другие методы на объекте User, они также могли бы получить доступ к PiArray, и это может иметь смысл иметь его.


Вы можете создать экземпляр, который имеет другой массив, хранящийся в нем, как это:

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

Давайте посмотрим, смогу ли я объяснить, чего я пытаюсь выполнить. Я думаю, вы ответили на часть моего вопроса. Я пытаюсь создать класс в JavaScript. И то, что я нашел, это то, что вы сказали, это было похоже на статический класс. То, что я хочу сделать, - это иметь экземпляры класса, чтобы значения отличались друг от друга. Это можно сделать в JavaScript? –

+0

У меня есть объект с массивом объектов, у которого есть массив объектов. И я хочу присвоить разные значения различным экземплярам. Я могу сделать это, это C#, но я не знаю, могу ли я сделать это в JavaScript. –

+0

@MarioRosario. Я добавил пример в конец моего ответа для создания объекта, в котором каждый экземпляр имеет другой массив в своих данных экземпляра. – jfriend00

Смежные вопросы