2016-12-04 8 views
0

Тест Jasmine (unit?) Я запускаю работы для всех тестов с моим кодом ниже, но последний тест дважды вызывает Gigasecond.date(), затем проверяет второй, что не удается.Почему эта функция Javascript не работает, если вызывается дважды?

var Gigasecond = function(date) { 
    this.startDate = date; 
}; 

Gigasecond.prototype.date = function() { 
    var x = this.startDate; 
    x.setSeconds(x.getSeconds() + 1000000000); 
    return x; 
    } 

module.exports = Gigasecond; 

Я думаю, я не знаю, почему это не удается. Когда я вхожу на консоль, я вижу, что дата увеличивается в два раза, но думает, что x - это отдельная переменная, которая создается/уничтожается при каждом вызове функции. Но, похоже, это не так. Есть x только ссылку на фактическое поле .startDate на объект? Есть ли справочный материал, как это работает? Я огляделся, но не смог найти ничего, что относится к тому, что происходит в этом коде.

+1

Там нет 'функция Gigasecond.date' в вашем коде. – zerkms

+0

и где на самом деле ваш единичный тест, который терпит неудачу? – smnbbrv

+0

Как вы называете эту функцию? Как вы тестируете значение, которое, по вашему мнению, увеличивается в два раза? – Quentin

ответ

0

Вы утверждаете, что вы

думал, что х является его собственной отдельной переменной, которая будет создаваться/уничтожены каждый раз, когда вызывается функция .. но мне кажется, нет. Является ли x ссылкой только на фактическое поле .startDate на объекте?

Это правильно. Даты - это объекты, а в JavaScript объекты присваиваются переменным по ссылке, а не копируются. Если вы собираетесь работать с копией, вам нужно сначала вернуть клон объекта Date с new Date(dateToBeCopied.getTime()).

В вашем коде, если вы хотите работать на копии даты, вам нужно заменить строку

var x = this.startDate; //assignment by reference 

с этой линией

var x = new Date(this.startDate.getTime()); //assignment by copy 

В примере кода ниже показано, как это работает. Объект Date dateA присваивается переменной refA по ссылке и переменной copyA копией. При изменении refA это влияет на dateA, тогда как copyA не изменяется.

var dateA = new Date(); 
 

 
//assign a reference to dateA 
 
var refA = dateA; 
 

 
//assign a copy of dateA 
 
var copyA = new Date(dateA.getTime()); 
 

 
//modify refA, increment with one year 
 
refA.setFullYear(refA.getFullYear() + 1); 
 

 
//variable refA points to dateA, 
 
//both show the date incremented with one year 
 
console.log('+1 year: ', dateA); 
 
console.log('+1 year: ', refA); 
 

 
//variable copyA returns an unmodified copy, 
 
//not incremented 
 
console.log('unmodified copy: ', copyA);

+0

Ah .. "объектам присваиваются переменные по ссылке, а не копия." Этого я не получил. Спасибо за ответ. – Atom999

 Смежные вопросы

  • Нет связанных вопросов^_^