2011-12-30 82 views
2

发现在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, 我做错了什么?

回答

1

你正在传递一个新的Date(),以被设置为当前时间测试()。然后你从当前时间Date().getTime()-bornTime.getTime()中减去它,因为时间流逝少于一毫秒,差值为0毫秒。

当你把它过去了一秒后的第二次,该变量并没有改变。您需要重做减法中的“动态法”(它实际上是所谓在JavaScript中的匿名函数)

1

当你创建对象的变量被设置。它始终是相同的价值。如果你想让它改变,你应该把它变成一个函数。你的代码实际上正在工作,只是你正在获得当前时间并从中减去当前时间。改变你通过的日期。

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

没有进一步的背景,我不明白这是如何解决这个问题的。 – 2011-12-30 20:53:04

1

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

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

好了,你要创建与现在bornTime是一个新的对象。

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

bornTime现在,你从现在开始减去它。从相同数量减去任何数为零,所以......我想现在你的问题是明显;)

+0

不是真的;而你所说的是真的,它没有解决问题的真实性质。 – 2011-12-30 20:47:05

2

你不重新计算ageInMillis;它会打印任何当你打电话给new

为了得到你所期望的行为,你需要这样的:

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

多数民众赞成在我的想法,但那么怎么会是第一个例子工作 – cipher 2011-12-30 20:52:36

+0

@cipher为什么不呢?第一个例子中的计算只需要进行一次。你的例子也进行计算,只是答案为零,因为你计算错误的地方。 – 2011-12-30 20:53:57

+0

Upvoted。这是我的答案。 :P – 2011-12-30 20:58:10

2

当你做var t=new Test(new Date());的ageInMillis计算并设置为0之后的任何呼叫,只是要回报你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