Распространение Javascript и наследование - PullRequest
0 голосов
/ 04 сентября 2018

Я довольно новичок в разработке JavaScript и все еще изучаю концепции. У меня вопрос по поводу спреда "оператор" (...). Может ли он использоваться в качестве механизма, подобного наследованию, или у него есть побочные эффекты, которые должны заставить меня избежать этого?

Пример

const A = {
  prop1: "value1",
  prop2: function() {return this.prop1}
}

const B = {
  ...A,
  prop1: "updated_value1",
  prop3: "value3"
}

B здесь видно, что он унаследован от A, A.prop2() возвращает value1, а B.prop2() возвращает updated_value1, который можно ожидать от любого унаследованного объекта.

Это действительно?

Ответы [ 6 ]

0 голосов
/ 04 сентября 2018

{... A} просто создает копию всех значений ключа из 'A' и устанавливает ее в 'B'. Затем вы обновляете свойство prop1 для 'B' до updated_value1. «А» остается без изменений. Это полностью верно

0 голосов
/ 04 сентября 2018

Отправленный вами код работает должным образом, так как свойства из A копируются в B. Однако это не пример наследования, это просто поверхностная копия.

В вашем примере все свойства являются примитивами, рассмотрим, что произойдет, если мы добавим ссылку на A:

const A = {
  prop1: "value1",
  prop2: function() {return this.prop1},
  obj: { value: 1 }
}

const B = {
  ...A,
  prop1: "updated_value1",
  prop3: "value3"
}

Теперь, изменение A.obj.value также изменит B.obj.value, что по существу заставит всех B делиться своими obj с A и между собой. Это может быть полезно в некоторых ситуациях, но это не совсем наследование.

Для наследования лучше всего использовать "Javascript классы"

0 голосов
/ 04 сентября 2018

Это может выглядеть как наследование, но на самом деле все, что вы определяете, это:

const A = {
  prop1: "value1",
  prop2: function() {return this.prop1}
}

const B = {
  prop1: "value1",
  prop2: function() {return this.prop1},
  prop1: "updated_value1",
  prop3: "value3"
}

По сути, вы переопределяете член, определенный на 2 строки для объекта B. Это не наследование, потому что определение членов будет принадлежать объекту B вместо прототипа B, например. При обращении к B.prop1 движку не нужно будет искать прототипы для свойства, что и делало бы наследование, если бы вы использовали protos

0 голосов
/ 04 сентября 2018

Я не буду называть это наследование. Использование оператора распространения с объектом аналогично использованию Object.assign (). Этот метод позволяет копировать значения всех перечисляемых собственных свойств из одного или нескольких исходных объектов в цель. объект. См. документацию

0 голосов
/ 04 сентября 2018

В вашем случае я бы предпочел использовать Object Assign, поскольку меньше вещей может пойти не так:

const A = {
  prop1: "value1",
  prop2: function() {return this.prop1}
}

cont B = Object.assign(A, {
  prop1: "updated_value1",
  prop3: "value3"
});

Но все же это не настоящее наследство.

0 голосов
/ 04 сентября 2018

Вы не можете назвать это неотъемлемостью. Это слияние. Написав это

const B = {
  ...A,
  prop1: "updated_value1",
  prop3: "value3"
}

props1 из A будет перезаписано prop1 из B. Так что да, B.prop2() вернет updated_value1, и это совершенно справедливо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...