OOP JS:变量传递/引用查询

时间:2011-09-15 14:58:14

标签: javascript oop reference pass-by-reference

在我的最后一个帖子(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/但事实却被告知我不明白......:)

有人能开导我吗?

2 个答案:

答案 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,您不需要传递任何内容!