JavaScript中的Object.create和继承

时间:2018-11-18 12:05:51

标签: javascript inheritance prototype

我正在从Udemy课程学习JavaScript中的Object.create和继承,但我有一个误会。我想问你是否可以帮助我了解它的工作原理。预先谢谢你!

例如,我有以下简单的代码行:

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);

我可以使用以下代码更改运动员构造函数吗?

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 _的,我知道原型和“笨拙”的原型,但在以下情况下我不理解。

例如,如果我写console.dir(abjAthlete),我将在控制台中得到以下输出:

enter image description here

讲师说原型是Person,这意味着运动员功能构造函数的prototype属性与Person原型属性相同。这怎么可能,因为如果我写Athlete.__proto__ === Person.prototype会收到 false 。我真的很感激任何反馈!

1 个答案:

答案 0 :(得分:2)

  

我想问问您是否必须添加以下代码行:

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

我可以使用以下代码更改运动员构造函数吗?

是的,您可以,而且效果完全相同。但是,您现在已经复制了Person的初始化代码,这是一个不好的做法。 Don't repeat yourself,然后调用已经知道如何初始化这些属性的Person构造函数。