Функциональные выражения не могут иметь вычисляемых имен, этот синтаксис разрешен только для литералов объекта или членов класса, поэтому вместо этого определите конструктор вашего SingleLinkedList
следующим образом:
constructor() {
_counts.set(this, 0);
_head.set(this, null);
_tail.set(this, null);
let instance = this;//closure
_iterator.set(this, function* (){
// remove the computed name ---^
let n=_head.get(instance);
while(n){
yield n;
n = n.next;
}
});
}
Возможно, даже больше полезно знать, как отлаживать синтаксические ошибки в будущем, поэтому вам не нужно снова задавать такие вопросы. Если вы откроете консоль разработчика, нажав F12, вы увидите журнал, который выглядит примерно так:
Нажмите эту ссылку, и она займет Вы прямо к месту нахождения ошибки:
Просто для удовольствия, я предлагаю переписать, используя некоторые более современные функции ECMAScript, такие как приватные поля :
class Node {
next = null;
constructor (value) {
this.value = value;
}
}
class SingleLinkedList {
#size = 0;
#head = null;
#tail = null;
// read only get accessor property
get size () {
return this.#size;
}
isEmpty () {
return this.#size === 0;
}
// insert a new Node (in tail) with the desired value
push (value) {
const node = new Node(value);
if (this.isEmpty()) {
this.#head = node;
} else {
this.#tail.next = node;
}
// the following instructions are common to both the cases.
this.#tail = node;
this.#size++;
// to allow multiple push call
return this;
}
// generator to return the values
*[Symbol.iterator] () {
for (let current = this.#head; current; current = current.next) {
yield current.value;
}
}
// the the values of each node
toString () {
return [...this].join(' ');
}
}
const myLinkedList = new SingleLinkedList();
myLinkedList.push(3).push(5);
console.log(myLinkedList.toString());