#javascript #error-handling
Вопрос:
class Speaker {
constructor(name) {
this.name = name;
}
get Message() {
if (!this.message.includes(this.name)) {
throw Error("message is missing speaker's name");
}
return this.message;
}
set Message(val) {
let tmpMessage = val;
if (!val.includes(this.name)) {
tmpMessage = this.name " " val;
}
this.message = tmpMessage;
}
}
const speaker = new Speaker();
speaker.Message = "hello";
console.log(speaker.Message);
Я взял этот код из книги. Я в замешательстве относительно того, почему ошибка не возникает при ее запуске, поскольку в книге говорится, что это так. Вместо этого я получаю неопределенное Привет, Может кто-нибудь пролить свет на это?
Комментарии:
1. Почему он должен выдавать ошибку? Пройдитесь по коду (или/и добавьте некоторые
console.log()
буквы, напримерconsole.log(val.includes(this.name))
), и вы поймете, почему он работает так, как работает.2. нет, я вижу, что это работает, но ошибка не возникает, когда я создаю новый динамик без имени. У меня есть ошибка, которая будет выдана, если я сделаю это в
getter this.name == undefined
книге, я думаю, что это ошибка в книге?
Ответ №1:
Это не ошибка, потому !this.message.includes(this.name)
что она не удовлетворена.
В вашем примере,
speaker.Message = "hello";
Когда вы позвонили по этому телефону, вы внутренне проверяете !val.includes(this.name)
. Вот this.name
undefined
так, !val.includes(this.name)
будет true
и сообщение, которое будет сохранено undefined hello
.
И по звонку
console.log(speaker.Message);
Вы проверяете !this.message.includes(this.name)
, вот this.name
так undefined
и this.message
есть undefined hello
.
В конце !this.message.includes(this.name)
концов так и будет false
. Следовательно this.message
, возвращается, undefined hello
и именно поэтому ошибка не возникает.
//!this.message.includes(this.name) -->
//this condition gets evaluated like below, hence error is not thrown
console.log(!"undefined hello".includes(undefined));
Комментарии:
1. В этом есть прекрасный смысл. Так что, возможно, я неправильно истолковываю книгу или пример в книге неправильный. В примере с книгами они указывают имя, только я удалил имя, чтобы попытаться увидеть, не возникает ли ошибка, которой в данном случае не было, и вы объяснили почему.
2. Рад, что помог вам 🙂