Я полагаю, что ваша проблема связана с этой строкой в определении leeftijd
:
var birthDate = new Date(DOB);
Там вы передаете параметр DOB
в качестве параметра, а не DOB человека (this.DOB
).
То, как вы это делаете, я не совсем уверен в том, как вы должны это делать.Я верю , это будет просто работать:
function createPerson(naam, achternaam, DOB, leeftijd){
this.naam = naam;
this.achternaam = achternaam;
this.DOB = DOB;
var self = this;
this.leeftijd = function(){ //method to calculate age.
var today = new Date();
var birthDate = new Date(self.DOB); // here we take the DOB of the person. The 'self' stuff feels weird, I know, google about 'self = this' to know more
var age = +today.getFullYear() - +birthDate.getFullYear();
var m = today.getMonth() - birthDate.getMonth();
if (m <0 || (m === 0 && today.getDate() < birthDate.getDate())){
age = age -1;
}
return age;
}
}
Теперь, однако, Не делайте этого! .Это не то, как вы должны делать ООП в JavaScript.Вы создаете leftijd
функцию для каждого человека, которого вы создаете.Это плохо.Все экземпляры людей должны иметь одинаковую функцию для расчета их возраста.Это делается путем добавления функции в конструктор prototype .
Теперь в javaScript есть несколько способов сделать это.Старомодным способом является ручная настройка функции leftijd
в прототипе Person
:
function Person(naam, achternaam, DOB, leeftijd){
this.naam = naam;
this.achternaam = achternaam;
this.DOB = DOB;
}
Person.prototype.leftijd = function(){ //method to calculate age.
var today = new Date();
var birthDate = new Date(this.DOB);
var age = +today.getFullYear() - +birthDate.getFullYear();
var m = today.getMonth() - birthDate.getMonth();
if (m <0 || (m === 0 && today.getDate() < birthDate.getDate())){
age = age -1;
}
return age;
}
(Обратите внимание, как я переименовал createPerson
в Person
. Конструкторы обычно в верхнем регистре в javaScript. Также, используя new
вы знаете, что создаете нового человека, поэтому create чувствует себя избыточно)
В этом коде выше я присоединяю функцию leftijd
к прототипу Person, что в основном означает, что все Personэкземпляры будут иметь эту функцию.
В исходном коде каждый созданный человек имеет свою собственную функцию leftijd
, которая, конечно, выделяет больше памяти.Это небольшая разница, но вы определенно не хотите добавлять функции к this
внутри конструктора.
Теперь, этот материал prototype
кажется странным, и хотя об этом полезно знать, естьэто синтаксис class
, который намного проще и понятнее :
class Person{
constructor(naam, achternaam, DOB, leeftijd){
this.naam = naam;
this.achternaam = achternaam;
this.DOB = DOB;
}
leftijd(){
var today = new Date();
var birthDate = new Date(this.DOB);
var age = +today.getFullYear() - +birthDate.getFullYear();
var m = today.getMonth() - birthDate.getMonth();
if (m <0 || (m === 0 && today.getDate() < birthDate.getDate())){
age = age -1;
}
return age;
}
}
В конце оба пути делают то же самое, но синтаксис класса скрывает вам странности prototype
ибольше похож на другие языки, такие как Java.
Удачи в изучении javaScript!