ООП JS: запрос на передачу / обращение к переменной - PullRequest
1 голос
/ 15 сентября 2011

Следуя моей последней теме ( здесь ), я думаю, что я указал проблему.

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

Контекст: у меня есть объект с именем «Расписание», внутри которого я создаю 52 «недельных» объекта.Каждая неделя имеет функции для возврата даты начала и окончания в формате MySQL, объекта даты JS и метки.Подробнее в предыдущем посте.

Он отлично работает, кроме случаев, когда я пытаюсь инициировать «EndDate».

/* --- LEAP.Schedule.week Object --- */

LEAP.Schedule.week = function(n_date, n_week){

    this.week = n_week;

    this.date = n_date;

    this.year = this.date.getFullYear();

    this.month = this.date.getMonth();

    this.month += 1;

    this.day = this.date.getDate();

    alert("BEFORE " + this.date.getDate());

    this.end_date = this.setEndDate(this.date);

    alert("AFTER " + this.date.getDate());

};

LEAP.Schedule.week.prototype.setEndDate = function(date) {

    var ret_date = date;

    ret_date.setDate(ret_date.getDate() + 6);

    return(ret_date);

}

Использование предупреждений по обе стороны от «this.setEndDate»будучи запущенным, я вижу, что this.date увеличивается каждый раз, когда запускается setEndDate.

Я не хочу, чтобы это произошло: я хочу, чтобы this.date оставался какдата передается в объект Object недели, и я хочу отдельную переменную с именем this.end_date, которая в основном this.date плюс шесть дней.Я нашел эту статью: http://www.snook.ca/archives/javascript/javascript_pass/ но, по правде говоря, я ее не понимаю ...:)

Может ли кто-нибудь меня просветить?

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011

Я думаю, это потому, что вы передаете «this.date» через setEndDate каждый раз, поэтому, когда вы запускаете ret_date.setDate, вы делаете это с this.date.Это потому, что «date» - это объект, ссылка на который передается.

Вы должны иметь возможность изменить его следующим образом:

var mydate = new Date(this.date);
this.end_date = setEndDate(mydate);

Объект mydate теперь будет изменен, чтоне повлияет на ваш код.

Еще лучше, вы можете просто указать установленную дату окончания, чтобы изменить this.end_date, основываясь на this.date, и вам не нужно ничего передавать!

2 голосов
/ 15 сентября 2011

Да,

var ret_date = date;

делает ret_date ссылкой на date, которая сама по себе this.date, как если бы вы передавали ее функции, она передавалась по ссылке.

Вы хотите скопировать дату, приращение и возврат;

LEAP.Schedule.week.prototype.setEndDate = function(date) {
    var ret_date = new Date(date.getTime());
    return ret_date.setDate(ret_date.getDate() + 6);
}
...