Как полностью очистить значения свойств и ссылки на объект JavaScript? - PullRequest
0 голосов
/ 06 марта 2012

Вчера я сделал простую игру на javascript, используя coffeescript.Большая часть игры проходит через объект game, который создается после того, как пользователь отправляет форму на странице.Форма содержит переменные и параметры для игры, в которую они хотят играть.

Все отлично работает во время игры, но когда игра заканчивается, у меня снова появляется форма, и если пользователь отправляет форму второй раз, он должен вызвать ту же функцию и перезаписать старую переменную gameс новым экземпляром объекта game, но я заметил, что он не сбрасывает все существующие переменные и параметры, установленные исходным игровым объектом.

Есть ли способ полностью удалить старый объект и его параметр при создании нового экземпляра?

Вот мой объект, объявленный в качестве класса в coffeescript.

window.Game   = class Game

  constructor: (options) ->
    players  = options[0] ? '1'
    p1 =  p2 = false
    @player1 = new Player(options[1] ? 'X', p1 )
    @player2 = new Player(options[2] ? 'O', p2 )
    @cells   = ($ "section#board .cell")
    @cells.each ->
      $(@).text(" ")
      $(@).removeClass('score')
    @currentPlayer = @player1
    @availableMoves = 9
    ($ 'section#board div.cell').bind
      click:      @.makeMove
      mouseleave: @.resetCell

    setTimeout(@.computerMove(@currentPlayer), 1000) if parseInt(players) is 0

Я вызываю это после отправки формы через эту функцию.

($ '#gameOptions').submit (event) ->
  event.target.checkValidity()
  event.preventDefault()
  game = new Game [($ '#player-count') .val(), 
                   ($ '#player-1-type').val(),
                   ($ '#player-2-type').val()]

Даже при добавлении вызова выполните delete game перед повторной реализацией игрового объекта.Призрачные переменные сохраняются.Я написал в coffeescipt для краткости и повышения читабельности.

1 Ответ

1 голос
/ 06 марта 2012

delete game не удалит объект, только ссылку.Проблема в том, что ссылки на старую переменную сохраняются где-то.Могут быть и другие, но по крайней мере эта часть конструктора доставляет вам проблемы:

  ($ 'section#board div.cell').bind
    click:      @.makeMove
    mouseleave: @.resetCell

JQuery позволяет вам связать несколько функций с одним и тем же событием;в этом случае и старая, и новая функции, а также старые содержат ссылку на старый объект.Чтобы это исправить, вы должны отменить привязку в функции отправки формы:

($ 'section#board div.cell').unbind()
...