Задать вопрос
alex4answ
@alex4answ

Как наследуются статические и обычные свойства, методы при указании прототипов?

Добрый день, снова запутался с прототипами.

obj.__proto__ - это [Prototype] текущего объекта
obj.prototype - это [Prototype] объекта который будет создан через new

Но почему не наследуются не статические свойства и методы при "ручном" наследовании:
class A {
  static foo = () => 'foo';
  bar = () => 'bar';
}

class B {}

Object.setPrototypeOf(B, A); // устанавливаем B.__proto__ = A, тем самым наследуем статические св-ва и методы
Object.setPrototypeOf(B.prototype, A.prototype); // устанавливаем B.prototype.__proto__ = A.prototype, тем самым наследуем не статические св-ва и методы


Но, наследуются только статические св-ва и методы.
const b = new B();
console.log(B.foo());
console.log(b.bar()); // Uncaught TypeError: b.bar is not a function


Что я делаю не так?
Скорее всего я что-то не правильно понял в прототипном наследовании, но уже раза 3 перечитал learn.javascript.ru разделы о прототипах, и ничего не изменилось
  • Вопрос задан
  • 131 просмотр
Подписаться 2 Средний 3 комментария
Решения вопроса 1
class A {
  static foo = () => 'foo';
  bar = () => 'bar';
}

// Тоже самое что и

class A {
  static foo = () => 'foo';

  constructor() {
    this.bar = () => 'bar';
  }
}

class B {}

// Т.е этот метод не попадает в A.prototype, а в обычные свойства. Соотвественно A.prototype у тебя пустой (там только свойство "constructor")

// class A {
//   static foo = () => 'foo';
//   
//   // Чтобы метод попал в прототип, а не записался как свойство, его нужно записывать в таком виде
//   bar() {
//     return 'bar'
//   }
// }

// console.log(A.prototype)
Object.setPrototypeOf(B, A); // устанавливаем B.__proto__ = A, (тут все ок)
Object.setPrototypeOf(B.prototype, A.prototype); // Этой строчкой ты унаследуешь только Prototype, свойства из constructor в нем не хранятся. Ты унаследовал A.prototype, а он пустой (там только свойство "constructor").
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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