动态生成的方法

时间:2011-12-30 20:40:37

标签: javascript date functional-programming

在Pro javascript技术书

中找到了这个例子
function User( name, age ) {
    var year = (new Date()).getFullYear()-age;
    this.getYearBorn = function(){
        return year;
    };
}
var user = new User( "Bob", 44 );
alert(user.getYearBorn());  //system date is 2010 ,alerts 1967

我将系统日期更改为2012

alert(user.getYearBorn()); //alerts 1968.

根据以上逻辑,我编写了以下代码

function Test(bornTime){
    var ageInMillis = new Date().getTime()-bornTime.getTime();
    this.age = function(){
        console.log("age:"+ageInMillis);
    }
}

var t = new Test(new Date());
t.age(); //output is zero
setTimeout(t.age,1000) // it prints 0

不应该第二次调用t.age打印1000, 我做错了什么?

5 个答案:

答案 0 :(得分:2)

您不会重新计算ageInMillis;当你打电话给new时,它会打印出来。

为了获得您期望的行为,您需要:

function Test(bornTime) {
    this.age = function() {
        var ageInMillis = new Date().getTime() - bornTime.getTime();
        console.log("age:" + ageInMillis);
    }
}

答案 1 :(得分:2)

当你执行var t=new Test(new Date());并设置为0时,会计算ageInMillis。之后的任何调用都将返回0

你应该改变你的功能,如下所示,

function Test(bornTime) {
  var ageInMillis; //=new Date().getTime()-bornTime.getTime();
  this.age = function() {
      ageInMillis = new Date().getTime() - bornTime.getTime();
      console.log("age:" + ageInMillis);
  }
}

var t = new Test(new Date());
t.age(); //output is zero
setTimeout(t.age, 1000); // it prints 0

jsFiddle here

答案 2 :(得分:1)

您将新的Date()传递给Test(),并将其设置为当前时间。然后从当前时间Date().getTime()-bornTime.getTime()中减去它,因为经过的时间小于一毫秒,差值为0毫秒。

当你在一秒钟后第二次调用它时,变量没有改变。您需要在“动态方法”中重做减法(它实际上称为JavaScript中的匿名函数)

答案 3 :(得分:1)

创建对象时正在设置变量。它始终是相同的值。如果你想改变你应该使它成为一个功能。你的代码实际上正在工作,它只是你获得当前时间并从中减去当前时间。更改传入的日期。

var ageInMillis=function() {
    Date().getTime()-bornTime.getTime()
};

答案 4 :(得分:1)

好吧,让我们来看看你在做什么。

var t=new Test(new Date());

好的,所以你现在正在创建一个bornTime的新对象。

var ageInMillis=new Date().getTime()-bornTime.getTime();
现在

bornTime,你现在正在减去它。从相同数字中减去的任何数字都是零,所以......我认为你的问题现在很明显;)