ООП в JavaScript наследование

160
08 октября 2019, 13:00

Почему не работает второй вариант? И можно ли что бы родительские свойства были в прототипе? a.call(this) по этой причине не подходит.

function A() { 
  this.one = 1; 
} 
 
function B() { 
  this.two = 2; 
} 
B.prototype = new A(); 
x = new B(); 
console.log(x); 
 
function a() { 
  this.one = 1; 
} 
 
function b() { 
  this.constructor.prototype = new a(); 
  this.two = 2; 
} 
z = new b(); 
console.log(z); 
console.log(new b());

Answer 1

"Не работает", так как внутри конструктора объект уже создан и его прототип назначен.

Так как меняется целиком объект прототипа, это никак не отразится на уже созданных объектах.

Вместо этого можно перенести все свойства из объекта new a() в сам прототип, например так:

function a() { 
  this.one = 1; 
} 
 
function b() { 
  Object.assign(this.constructor.prototype, new a()); 
  this.two = 2; 
} 
z = new b(); 
console.log(z);

Однако обновлять прототип для всех созданных объектов, при каждом создании объектов может быть не очень хорошей идеей.

READ ALSO
Получить геоданные массива адресов

Получить геоданные массива адресов

Есть массив адресовМне нужно получить координаты этих адресов и отобразить их на карте

209
Получение данных с сайта www.investing.com в google sheets

Получение данных с сайта www.investing.com в google sheets

столкнулся со следующей проблемой: Пытаюсь получить с сайта https://wwwinvesting

162
Конкатенация в объектах js

Конкатенация в объектах js

Дан следующий код

169
Как работают регулярные выражения в js?

Как работают регулярные выражения в js?

Есть строка 'IM'">Сегодня 12:36</span> Хочу получить из него дату

185