Object.create и наследование в JavaScript - PullRequest
0 голосов
/ 18 ноября 2018

Я изучаю Object.create и наследование в JavaScript из курса Udemy, и у меня возникло недоразумение. И я хочу спросить вас, можете ли вы помочь мне понять, как это работает. Заранее спасибо!

Например, у меня есть эта простая строка кода:

var Person = function(name, yearOfBirth, job) {
    this.name = name;
    this.yearOfBirth = yearOfBirth;
    this.job = job;
};

Person.prototype.calculateAge = function() {
    var age = new Date().getFullYear() - this.yearOfBirth;
    console.log(age);
};

var Athlete = function(name, yearOfBirth, job, olympicGames, medals) {
    Person.call(this, name, yearOfBirth, job);
    this.olympicGames = olympicGames;
    this.medals = medals;
};

Athlete.prototype = Object.create(Person.prototype);
Athlete.prototype.constructor = Athlete; 

var objAthlete = new Athlete('Mark', 1990, 'swimmer', 3, 10);

Я хочу спросить вас, обязательно ли ставить эту строку кода:

Person.call(this, name, yearOfBirth, job);

Могу ли я изменить конструктор Athlete с помощью следующего кода:

var Athlete = function(name, yearOfBirth, job, olympicGames, medals) {
    this.name = name;
    this.yearOfBirth = yearOfBirth;
    this.job = job;     
    this.olympicGames = olympicGames;
    this.medals = medals;
};

Я понимаю, почему мы используем Object.create и почему мы присваиваем правильное значение свойству конструктора прототипа, но я не понимаю, обязательно ли это строка кода.

И еще один вопрос о _ proto _, я знаю о prototype и "dunder" proto, но я не понимаю его в следующей ситуации.

Например, если я напишу console.dir(abjAthlete), я получу этот вывод в консоли:

enter image description here

Инструктор говорит, что прототипом является Person, и это означает, что свойство прототипа конструктора функции Athlete совпадает со свойством прототипа Person. Как это возможно, потому что если я пишу Athlete.__proto__ === Person.prototype, я получаю false . Я очень ценю любые отзывы!

1 Ответ

0 голосов
/ 18 ноября 2018

Я хочу спросить вас, обязательно ли ставить эту строку кода:

Person.call(this, name, yearOfBirth, job);

Могу ли я изменить конструктор Athlete с помощью следующего кода?

Да, вы могли бы, и это имело бы точно такой же эффект. Однако вы бы сейчас продублировали код инициализации для Person с, и это плохая практика. Не повторяйте себя , а просто вызовите конструктор Person, который уже знает, как инициализировать эти свойства.

...