【发布时间】:2018-11-18 12:05:51
【问题描述】:
我正在从 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);
我可以使用以下代码更改 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),我会在控制台中得到这个输出:
导师说原型是Person,也就是说Athlete函数构造函数的原型属性和Person原型属性是一样的。这怎么可能,因为如果我写 Athlete.__proto__ === Person.prototype 我会收到 false。我真的很感激任何反馈!
【问题讨论】:
-
"讲师说原型是 Person" - 不,您的
abjAthlete实例的原型是Athlete.prototype,正如您所期望的那样。控制台只是说这个对象“看起来像一个Person实例”——因为它继承自Person.prototype。
标签: javascript inheritance prototype