динамически генерируемые методы - PullRequest
2 голосов
/ 31 декабря 2011

нашел этот пример в книге Pro javascript Technique

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 print 1000, я что-то не так делаю?

Ответы [ 5 ]

2 голосов
/ 31 декабря 2011

ageInMillis рассчитывается, когда вы набираете var t=new Test(new Date()); и устанавливаете как 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 здесь

2 голосов
/ 31 декабря 2011

Вы не пересчитываете ageInMillis;он напечатает все, что было, когда вы звонили new.

Чтобы получить ожидаемое поведение, вам нужно:

function Test(bornTime) {
    this.age = function() {
        var ageInMillis = new Date().getTime() - bornTime.getTime();
        console.log("age:" + ageInMillis);
    }
}
1 голос
/ 31 декабря 2011

ваша переменная устанавливается при создании объекта.тогда это одно и то же значение за все время.если вы хотите, чтобы это изменилось, вы должны сделать это функцией.хотя ваш код действительно работает, просто вы получаете текущее время и вычитаете из него текущее время.измените дату, которую вы передаете.

var ageInMillis=function() {
    Date().getTime()-bornTime.getTime()
};
1 голос
/ 31 декабря 2011

Хорошо, давайте посмотрим, что вы делаете.

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

Хорошо, значит, вы создаете новый объект с bornTime сейчас.

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

bornTime сейчас, и вы вычитаете это сейчас. Любое число, вычтенное из того же числа, равно нулю, так что ... я думаю, что ваша проблема очевидна;)

1 голос
/ 31 декабря 2011

Вы передаете новую Date () в Test (), которая установлена ​​на текущее время. Затем вы вычитаете его из текущего времени Date().getTime()-bornTime.getTime(), поскольку прошедшее время было меньше миллисекунды, разница составляет 0 миллисекунд.

Когда вы вызываете его второй раз по истечении одной секунды, переменная не изменяется. Вам нужно будет повторить вычитание в «динамическом методе» (в JavaScript это называется анонимной функцией)

...