Есть ли разница между этими двумя способами наследования? - PullRequest
0 голосов
/ 07 мая 2019

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

Child.prototype = Object.create( Father.prototype );
Child.prototype.constructor = Child;

и:

Child.prototype.__proto__ = Father.prototype;

Первый вариантпозволяет нам получить все свойства и методы, которыми делится наш Отец, но при этом перезаписывает конструктор Child.Вот что нам нужно, чтобы снова установить конструктор Child в Child.Второй метод делает то же самое, но без перезаписи.Итак, почему люди / гиды не используют второй вариант?Я что-то не так?

Это полный пример:

function Father( name ) {
  this.name = name;
}

Father.prototype.getName = function() {
  console.log( this.name );
}

function Child( name, lastName ) {
  Father.call( this, name );
  this.lastName = lastName;
}

Child.prototype.__proto__ = Father.prototype;

//Child.prototype = Object.create( Father.prototype );
//Child.prototype.constructor = Child;

var c = new Child( 'Will' , 'Travolta');
c.getName();

Ответы [ 2 ]

2 голосов
/ 07 мая 2019

Я не вижу разницы между этими двумя методами

На самом деле нет никакой разницы в результатах (кроме мелких деталей, таких как перечисляемость свойства .constructor).

Итак, почему люди / гиды не используют второй вариант?

Поскольку __proto__ устарела , а Object.create работает где угодно. Он был стандартизирован с ES5 и может быть легко заполнен для более старых сред.

Начиная с ES6, вы также можете использовать Object.setPrototypeOf, но, начиная с ES6, вы просто пишете class Child extends Father { … }.

0 голосов
/ 07 мая 2019

Как написано в комментариях, __proto__ в настоящее время не рекомендуется в пользу Object.getPrototypeOf() и Object.setPrototypeOf(). Кроме того, существует множество открытых дискуссий о правильности полной перезаписи прототипа конструктора по сравнению с индивидуальным добавлением / удалением свойств / методов в него. Обе практики широко приняты / реализованы, и это факт, что уничтожение prototype.constructor (или всего прототипа объекта) в большинстве случаев не приносит вреда. Я предпочитаю индивидуальные манипуляции, так как это должно быть будущее. Обратите внимание, что при написании Child.prototype = Object.create(Father.prototype) вы уничтожаете оригинальный прототип.

...