Наследование и массив в Javascript (ES-2015+)

203
24 мая 2017, 07:35

Никак не могу найти ответ в Инете и разобраться что вообще происходит.

Минимальный, самодостаточный и воспроизводимый пример:

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 (??????)

Answer 1

Проблема в том, что в e.someArray хранится ссылка на массив.

При создании экземпляра SomeClass, в поле сохраняется ссылка на массив.

При присваивании:

e.someArray = [3, 2, 1]

ссылка в самом объекте меняется, но во внутреннем объекте ekz ссылка осталась на старый массив.

Вариантов решения несколько:

  1. не изменять это свойство напрямую.
  2. сохранять не отдельное поле, а полностью объект.
  3. создавать 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 (??????)

READ ALSO
Анимация для плеера

Анимация для плеера

Здравствуйте, подскажите, пожалуйста, как такое можно реализовать?http://10yearsmetalloinvest

272
Почему не работает выборка?

Почему не работает выборка?

Добрый день, почему я немогу обратиться к $('body') через scrollerselement, получаю: Uncaught TypeError: Cannot read property 'element' of undefined но вот так $('body')

259
Выбрать со строки только правила CSS

Выбрать со строки только правила CSS

Есть строка в которой несколько правил CSSПример:

214
вопрос по classList.toggle

вопрос по classList.toggle

как сделать что бы при нажатии на div с классом test у элемента c айди test убирался класс foo если он был до этого установлен , и если нажать на элемент...

220