【问题标题】:Object.create and inheritance in JavaScriptJavaScript 中的 Object.create 和继承
【发布时间】: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


【解决方案1】:

我想问你这行代码是不是必须放:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-13
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    相关资源
    最近更新 更多