Проблема в том, что ваша функция pushError
никак не связана с создаваемым вами экземпляром User
.
Внутри pushError
, this
не является новым объектом User
, который вы вы пытаетесь создать, следовательно, this.errors
равно undefined
, и вы не можете вызвать push
для undefined
.
Кроме того, запись register
в виде функции стрелки вместо обычной функции делает ее потерять значение this
(this
становится значением окружающего контекста, window
в браузере или global
в Node.js).
Для решения этой проблемы необходимо выполнить три шага.
Сначала вы должны переписать pushError
как часть цепочки прототипов User
, например:
User.prototype.pushError = function(str) {
this.errors.push(`You must provide a valid ${str}.`);
};
Во-вторых, вы должны использовать this.pushError
вместо pushError
в validate
:
User.prototype.validate = function() {
if (this.username.replace(" ", "") == "") {
this.pushError("Username");
}
if (this.password == "") {
this.pushError("Password");
}
if (this.mail.replace(" ","") == "") {
this.pushError("Email");
}
}
В-третьих, напишите register
как обычную функцию:
User.prototype.register = function() {
//Step #1: Validate user Data
this.validate();
//Step #2:If validated store data to DB
}
Это должно сделать это. Теперь несколько дополнительных комментариев и ресурсов. Это может помочь вам:
- Копаться в JavaScript Объекты в MDN, особенно в разделе Прототипы объектов .
- Напишите ваш код как класс ES6, который является более «современным» способом сделать то же самое: в этой статье приведены примеры того, как писать вещи «прототипным способом» или с помощью классов.
- Узнайте больше о различиях между обычными и «толстыми стрелками» в этой статье .