|
|
|
| вот у меня возник новый вопрос:
поля, не инициализированные в конструкторе при создании нового экземпляра
function Calendar() {
...
this.date = currentDate;
this.dPlusWeek = null;
this.showDate = null;
this.pole = "";
...
|
инициализируются при вызове метода класса:
//метод отрисовки календаря
this.drow = function(date,showDate,poleId) {
//создаем локальную переменную :
var date = date;
//вызваем метод инициализации, в нем устанавливаются поля класса:
this.setProperties(date,showDate,poleId);
теперь поле this.date равняется текущей дате.
alert(this.date); // выводит 28 cентября
теперь вызываем метод, в котором необходимо увеличить дату на неделю и вывести в поле:
pole.value = this.datePlus(date);
ТЕПЕРЬ ПОЛЕ ДАТЫ ТОЖЕ ИЗМЕНИЛОСЬ НА НЕДЕЛЮ!!!!
alert(this.date); //выводит 5 октября, то есть меняет поле класса!
};
ВОПРОС-ПОЧЕМУ?
я понимаю, что дело в ссылка, но не могу решить как исправить!
это методы для установки полей класса
/*метод установки свойств класса*/
this.setProperties = function(date,showDate,poleId) {
var date = date;
this.date = date;
this.showDate = showDate;
this.poleId = poleId;...
};
и изменения даты:
/*метод создания даты бронирования*/
this.datePlus = function(date) {
var d = date;
d.setDate(d.getDate() + 7);//меняем дату
var dPlusWeek = d;
alert(dPlusWeek); // выведет 5 октября, как и нужно
return dPlusWeek;
};
несколько запутано, но если коротко- почему изменение переменной в одном меоде ведет к изменению поля класса косвенно? | |
|
|
|
|
|
|
|
для: katty
(28.09.2006 в 17:55)
| | (код не выделен, неудобно читать)
смог разобрать (через специальный редактор :) ), что вам нужно определиться с тем, что будет делать datePlus() - прибавлять к полю, выводить значение или то и другое. Вопрос чисто в определениях. Если нужно поменьше функций, я бы сделал тоько выдачу значения, потому что к полю можем прибавить отдельно.
Calendar.prototype.datePlus== function(date) {
return date.setDate(d.getDate() + 7);}
cal1=new Calendar();
...
сal1.date=дата;
pole.value =сal1.date=сal1.datePlus(сal1.date);
|
| |
|
|
|
|
|
|
|
для: 12345
(28.09.2006 в 18:24)
| | спасибо за помощь:),
уже с утра перечитав пост-поняла что вопрос сводится к следующему- если внутри функции изменяется переданный параметр (date) - почему изменяется также и поле класса, которое ранее было инициализировано этой же date.
изменив код функции
DateUtils.datePlus = function(date, number) {
var date = date;
date.setDate(date.getDate() + number);
return date;
};
|
на
DateUtils.datePlus = function(date, number) {
var date = new Date(date.getTime());
date.setDate(date.getDate() + number);
return date;
};
|
все получилось.
Можно, если не трудно объяснить почему так происходит - я интуитивно понимаю-но если можно- на пальцах как-нибудь пояснить-тут видимо работает механизм ссылок?
заранее большое спасибо) | |
|
|
|
|
|
|
|
для: katty
(29.09.2006 в 11:53)
| | Да, именно потому что объекты адресуются только по ссылкам, var date = date; , если date - объект, то внутренний параметр date (кстати, это тавтология (излишний оператор), параметр и без того локальная переменная) есть ссылка на него, а не новый объект. В прежней теме тоже подобное фигурировало - почему мы не могли копировать объекты через Cal2=Cal1; ? | |
|
|
|
|
|
|
|
для: 12345
(29.09.2006 в 13:25)
| | я раньше и использовала ПРОСТО ПАРАМЕТР, а когда стала искать ошибку-попробовала через var внутри объявить, чтоб уж наверняка область видимости была локальная)
все встало на свои места- спасибо огромное))
буду учить мат.часть)) | |
|
|
|