2013-04-26 2 views
0

Я определил функцию Node, которая хранит свойства узлов в структуре данных графа. Функция что-то вроде этого:Изменение переменных класса в ООП в javascript

function Node(){ 
    ... 
    this.outEdges = []; 
    this.inEdges = []; 
    ... 
} 

где inEdges и немного опережает магазин элементов типа Край, который является еще одной функцией я определил. Во время программы эти массивы заполнены элементами.

В какой-то момент в моем коде мне нужно сбросить эти два массива пишу я так:

nodes[i].outEdges.length = 0; 
    nodes[i].inEdges.length = 0; 

, где узлы представляет собой массив элементов типа Node и я доступ к элементу в цикле.

Проблема заключается в том, что после установки значенийEdges и inEdges на 0 я ожидал, что они будут [] в списке свойств узлов [i]. Однако, когда я выводя узлы [i] в ​​консоль, outEdges и inEdges все еще имеют в них элементы. Самое странное, что когда я выводю узлы [i] .outEdges на консоль, он печатает [], что верно, но при нажатии на [] снова открывается список элементов! Я не могу понять, почему переменные node [i] не меняются?

+0

В каком браузере вы испытываете это? –

+2

Можете ли вы добавить еще код? Скорее всего, там, где вы обращаетесь к узлам и переинициализации, это проблема. Вы можете запустить консольную проверку .. 'var arr = [1, 2, 3]; arr.length = 0; arr // выходы [] ' –

+0

Сам по себе процесс, который вы описали в своем сообщении, должен работать. Проблема, вероятно, лежит где-то еще в вашем коде. – orb

ответ

0

Вы не должны устанавливать поле длины. Просто повторно инициализировать их:

nodes[i].outEdges = []; 
nodes[i].inEdges = []; 

Edit: Мое плохое, установка длина должна работать. Это работает для меня, по крайней мере, в Chrome. Тем не менее, я все еще думаю, что это более безопасный и лучший стиль для перезапуска.

+2

Установка длины массивов в 0 делает повторную инициализацию массива. – Vlad

+0

«Вы можете установить свойство length для усечения массива в любое время». Справка: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Array/length – orb

+2

Это также описано в документации: http://es5.github.io/#x15.4.5 0,1. –

-1

Просто создайте новый объект с тем же именем

nodes[i].outEdges = new Array(); 
+0

Это плохой способ создать массив в javascript. –

+0

Почему? Я делаю то же самое с объектами (var obj = new Object()) Я узнал JS из MDN, а не в учебнике, поэтому решил, что это хорошо после просмотра в wiki: https://developer.mozilla.org/en- US/docs/JavaScript/Reference/Global_Objects/Array –

+0

@ Chris.Stover Ну, когда вы создаете массив с помощью 'new Array()', он сообщает интерпретатору искать конструктор 'Array' в контексте выполнения и называть его сгенерировать новый объект, добавив немного служебных данных для процесса. С другой стороны, '[]' мгновенно создает новый массив времени выполнения. –

1

Это происходит (возможно), так как браузер выводит пустой массив, но к тому времени вы проверить его, он снова имеет содержание. Поэтому, когда вы нажимаете, чтобы развернуть браузер, отображается фактическое содержимое. enter image description here

Как вы можете видеть значения [1,3,7] были добавлены после команды console.log(o) но они отображаются на экране (даже если длина показана 0).

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