在我的最后一个帖子(here)之后,我想我已经指出了这个问题。
然而,我正在努力理解为什么会发生这种情况让我头疼。
上下文:我有一个名为“Schedule”的对象,我在其中创建了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”任一侧的警报,我可以看到每次运行“setEndDate”时“this.date”都会递增。
我不希望发生这种情况:我希望“this.date”保留为传递给周Object的日期,我想要一个名为“this.end_date”的单独变量,它基本上是this.date plus六天。
我认为这是一个引用问题。我找到了这篇文章:http://www.snook.ca/archives/javascript/javascript_pass/但事实却被告知我不明白......:)
有人能开导我吗?
答案 0 :(得分:2)
是的;
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);
}
答案 1 :(得分:2)
我认为这是因为你每次都将“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
,您不需要传递任何内容!