Задать вопрос
Muranx
@Muranx
кто понял this тот в цирке не смеётся

Как можно в Js реализовать доступ к полям родительского «класса»?

Здравствуйте!

class A{ constructor(){ this.obj = {'b':1, 'c': 2}; } };

class B extends A{ 
	constructor(){super(); this.nvmProp = 'zZzz'} 
	changeObj(){ this.obj.b = 10; }
};

class C extends A{ 
	constructor(){super(); this.nvmProp = 'zZzzZz'} 
	changeObj(){ this.obj.c = 20; }
};

let a = new A(),
    b = new B(),
    c = new C();

b.changeObj();
c.changeObj();

console.log(a.obj); /* {b:1,c:2} ofc. */

Когда я вызываю метод b.changeObj() а также с.changeObj() мне нужно чтобы они изменяли один и тот же объект, офк сейчас этого не происходит. Можно ли это сделать с моделью прототипного наследования js? Я конечно могу реорганизовать код таким образом, чтобы методы SomeObject.changeObj() возвращали свою часть объекта, к примеру b.changeObj() /* return {b:10} */ но возможно есть и другие варианты! Код разумеется утрирован для примера, в реалиях разумеется методы выполняют больше работы
  • Вопрос задан
  • 52 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
Starina_js
@Starina_js
full-stack web dev
В вашем примере obj является простым объектом и не связан с прототипом класса.
Поэтому, если вы измените obj в одном экземпляре класса, это не отразится на других экземплярах.

Если вы хотите, чтобы изменения obj в одном экземпляре класса отражались на других экземплярах, вам нужно превратить obj в свойство прототипа класса.

class A {
  constructor() {
    if (!A.prototype.hasOwnProperty('obj')) {
      A.prototype.obj = { 'b': 1, 'c': 2 };
    }
  }
}

class B extends A {
  constructor() {
    super();
    this.nvmProp = 'zZzz';
  }
  changeObj() {
    this.obj.b = 10;
  }
}

class C extends A {
  constructor() {
    super();
    this.nvmProp = 'zZzzZz';
  }
  changeObj() {
    this.obj.c = 20;
  }
}

let a = new A();
let b = new B();
let c = new C();

b.changeObj();
c.changeObj();

console.log(b.obj); // {b: 10, c: 20}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы