Никак не могу найти ответ в Инете и разобраться что вообще происходит.
Минимальный, самодостаточный и воспроизводимый пример:
const FirstClass = class {
constructor(obj) {
this.someArray = obj.someArray;
}
}
const SecondClass = class extends FirstClass {
funcTest() {
console.log(this.someArray[0]);
}
}
const SomeClass = class {
constructor() {
this.someArray = [1, 2, 3];
this.ekz = new SecondClass(this);
}
someFunc() {
this.ekz.funcTest();
}
}
let e = new SomeClass;
e.someArray = [3, 2, 1]
console.log(e.someArray); // 3,2,1
e.someFunc(); // 1 (??????)
Проблема в том, что в e.someArray хранится ссылка на массив.
При создании экземпляра SomeClass, в поле сохраняется ссылка на массив.
При присваивании:
e.someArray = [3, 2, 1]
ссылка в самом объекте меняется, но во внутреннем объекте ekz ссылка осталась на старый массив.
Вариантов решения несколько:
ekz не в конструкторе, а непосредственно в функции someFunc().Например:
const FirstClass = class {
constructor(obj) {
this.obj = obj;
}
get someArray() {
return this.obj.someArray;
}
}
const SecondClass = class extends FirstClass {
funcTest() {
console.log(this.someArray[0]);
}
}
const SomeClass = class {
constructor() {
this.someArray = [1, 2, 3];
this.ekz = new SecondClass(this);
}
someFunc() {
this.ekz.funcTest();
}
}
let e = new SomeClass;
e.someArray = [3, 2, 1]
console.log(e.someArray); // 3,2,1
e.someFunc(); // 1 (??????)
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости