我正在从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)
,我将在控制台中得到以下输出:
讲师说原型是Person,这意味着运动员功能构造函数的prototype属性与Person原型属性相同。这怎么可能,因为如果我写Athlete.__proto__ === Person.prototype
会收到 false 。我真的很感激任何反馈!
答案 0 :(得分:2)
我想问问您是否必须添加以下代码行:
Person.call(this, name, yearOfBirth, job);
我可以使用以下代码更改运动员构造函数吗?
是的,您可以,而且效果完全相同。但是,您现在已经复制了Person
的初始化代码,这是一个不好的做法。 Don't repeat yourself,然后调用已经知道如何初始化这些属性的Person
构造函数。