Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

HTML+CSS+JavaScript

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: передача параметра в методах класса
 
 автор: katty   (28.09.2006 в 17:55)   письмо автору
 
 

вот у меня возник новый вопрос:

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


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;
};
несколько запутано, но если коротко- почему изменение переменной в одном меоде ведет к изменению поля класса косвенно?

   
 
 автор: 12345   (28.09.2006 в 18:24)   письмо автору
 
   для: 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);

   
 
 автор: katty   (29.09.2006 в 11:53)   письмо автору
 
   для: 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;
    };

все получилось.
Можно, если не трудно объяснить почему так происходит - я интуитивно понимаю-но если можно- на пальцах как-нибудь пояснить-тут видимо работает механизм ссылок?
заранее большое спасибо)

   
 
 автор: 12345   (29.09.2006 в 13:25)   письмо автору
 
   для: katty   (29.09.2006 в 11:53)
 

Да, именно потому что объекты адресуются только по ссылкам, var date = date; , если date - объект, то внутренний параметр date (кстати, это тавтология (излишний оператор), параметр и без того локальная переменная) есть ссылка на него, а не новый объект. В прежней теме тоже подобное фигурировало - почему мы не могли копировать объекты через Cal2=Cal1; ?

   
 
 автор: katty   (29.09.2006 в 13:56)   письмо автору
 
   для: 12345   (29.09.2006 в 13:25)
 

я раньше и использовала ПРОСТО ПАРАМЕТР, а когда стала искать ошибку-попробовала через var внутри объявить, чтоб уж наверняка область видимости была локальная)
все встало на свои места- спасибо огромное))
буду учить мат.часть))

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования