JS原型链-2023_05_05

  • 请考虑以下 JavaScript 代码,并回答随后的问题:
function Person(name) {
  this.name = name;
}
​
Person.prototype.getName = function() {
  return this.name;
};
​
function Employee(name, position) {
  Person.call(this, name);
  this.position = position;
}
​
Employee.prototype = Object.create(Person.prototype);
Employee.prototype.constructor = Employee;
​
Employee.prototype.getPosition = function() {
  return this.position;
};
​
const alice = new Employee("Alice", "Software Engineer");
const bob = new Person("Bob");
​
Person.prototype.getDetails = function() {
  return `${this.name} is a person.`;
};
​
Employee.prototype.getDetails = function() {
  return `${this.name} is a ${this.position}.`;
};

问题:

  1. 描述 alicebob 对象在原型链中的层级关系,包括 PersonEmployee 构造函数以及它们的原型对象。
  2. alice.getDetails()bob.getDetails() 的返回值分别是什么?
  3. 如果我们在 Employee.prototype 上添加一个新方法 getSalaryalicebob 是否都能访问这个方法?请解释原因。
  4. 当我们调用 alice.constructor 时,返回值是什么?请解释原因。
  5. 如果我们想要为 Person 对象添加一个新的方法 getAge,应该如何实现?在这种情况下,alicebob 是否都能访问这个方法?请解释原因。

答案

以下是针对问题的详细解答:

  1. alicebob 在原型链中的层级关系:

    • aliceEmployee 的实例。它的原型链顺序是:alice -> Employee.prototype -> Person.prototype -> Object.prototype -> null
    • bobPerson 的实例。它的原型链顺序是:bob -> Person.prototype -> Object.prototype -> null
  2. alice.getDetails()bob.getDetails() 的返回值:

    • alice.getDetails() 返回 “Alice is a Software Engineer.”,因为 aliceEmployee 的实例,所以它会使用 Employee.prototype 上定义的 getDetails 方法。
    • bob.getDetails() 返回 “Bob is a person.”,因为 bobPerson 的实例,所以它会使用 Person.prototype 上定义的 getDetails 方法。
  3. 如果我们在 Employee.prototype 上添加一个新方法 getSalaryalice 能访问这个方法,但 bob 无法访问。这是因为 aliceEmployee 的实例,其原型链包含 Employee.prototype,而 bobPerson 的实例,其原型链不包含 Employee.prototype

  4. 当我们调用 alice.constructor 时,返回值是 Employee 构造函数。这是因为在继承过程中,我们将 Employee.prototype.constructor 显式地设置为 Employee,从而修复了原型链中 constructor 属性的引用。

  5. 如果我们想要为 Person 对象添加一个新的方法 getAge,可以将方法添加到 Person.prototype 上,如下所示:

Person.prototype.getAge = function() {
  return this.age;
};

在这种情况下,alicebob 都能访问这个方法,因为它们的原型链都包含 Person.prototype。具体来说,alice 的原型链包含 Employee.prototypePerson.prototype,而 bob 的原型链直接包含 Person.prototype

原文链接:https://juejin.cn/post/7232239024106373179 作者:2002XiaoYu

(0)
上一篇 2023年5月13日 上午10:46
下一篇 2023年5月13日 上午10:56

相关推荐

发表回复

登录后才能评论