Как использовать метод join () в конструкторе класса? - PullRequest
0 голосов
/ 28 января 2020

Я создал синтаксис класса со свойствами и методами. У свойств есть массивы, и я хотел создать пространство между этими элементами в массивах. Когда я создал метод, который возвращает строку с этими свойствами, я использовал метод join (','), чтобы освободить место между элементами массива.

Когда я создаю свои экземпляры и вызываю их в консоли, это не работает. Выдает эту ошибку:

*Uncaught TypeError: this.interests.join is not a function*

вот мой код:

class Person {
  constructor(first, last, age, gender, interests) {
    this.name = {
      first,
      last
    };

    this.age = age;
    this.gender = gender;
    this.interests = interests;
  }


  greeting() {
    * //here is the problem *
    let hobbies = this.interests.join(' ,')
    return `Hi. I'm ${this.name.first} I am ${this.age} . I like ${hobbies}`;
  }

  farewell() {
    return `${this.name.first} has left the building. Bye for now!`;
  }
}

class Student extends Person {
  constructor(first, last, age, gender, interests, grade) {
    super(first, last, age, gender, interests);

    this.grade = grade;
  }
}

let ron = new Student('Ron', 'Weasley', 14, 'Quidditch', 3);
let harry = new Student('Harry', 'Potter', 14, ['Quidditch', 'cause problems'], 3);
let hermione = new Student('Hermione', 'Granger', 14, ['Studying', 'Read'], 3);
let neville = new Student('Neville', '', 14, 'Herbiology', 3);

Ответы [ 2 ]

4 голосов
/ 28 января 2020

Кажется, что в некоторых случаях (ron и neville) аргумент interests, который вы передаете своему конструктору, является не массивом, а строкой.

Затем, когда вы вызываете greeting метод позже, метод join отсутствует в строках, следовательно, ошибка.

Вы должны преобразовать интересы, заданные в конструкторе, в массив всегда с чем-то вроде:

this.interests = Array.isArray(interests) ? interests : [ interests ]

Редактировать:

Как предлагает Ивар в комментарии ниже, вы на самом деле отправляете число вместо аргумента интересов.

constructor(first, last, age, gender, interests)

//            ^      ^    ^      ^        ^
//            |      ++   +---+  +-----+  +----+
//            |       |       |        |       |

new Student('Ron', 'Weasley', 14, 'Quidditch', 3)

Итак, сначала измените порядок аргументов, когда создавая экземпляры, затем убедитесь, что они всегда являются массивами.

2 голосов
/ 28 января 2020

У вас две проблемы.

Во-первых, ваш конструктор класса ожидает interests в качестве 5-го параметра.

constructor(first, last, age, gender, interests) {

Однако при создании экземпляра вы передаете его как 4-й параметр, например,

let harry = new Student('Harry', 'Potter', 14, ['Quidditch', 'cause problems'], 3);

Кроме того, ваш набор текста противоречив interests (несмотря на то, что он передан неверному параметру) обычно передается как массив, но иногда как строка.

let ron = new Student('Ron', 'Weasley', 14, 'Quidditch', 3);

Это приведет к ошибке, поскольку строки, очевидно, не имеют .join() метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...