- 请考虑以下 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}.`;
};
问题:
- 描述
alice
和bob
对象在原型链中的层级关系,包括Person
和Employee
构造函数以及它们的原型对象。 alice.getDetails()
和bob.getDetails()
的返回值分别是什么?- 如果我们在
Employee.prototype
上添加一个新方法getSalary
,alice
和bob
是否都能访问这个方法?请解释原因。 - 当我们调用
alice.constructor
时,返回值是什么?请解释原因。 - 如果我们想要为
Person
对象添加一个新的方法getAge
,应该如何实现?在这种情况下,alice
和bob
是否都能访问这个方法?请解释原因。
答案
以下是针对问题的详细解答:
-
alice
和bob
在原型链中的层级关系:alice
是Employee
的实例。它的原型链顺序是:alice
->Employee.prototype
->Person.prototype
->Object.prototype
->null
。bob
是Person
的实例。它的原型链顺序是:bob
->Person.prototype
->Object.prototype
->null
。
-
alice.getDetails()
和bob.getDetails()
的返回值:alice.getDetails()
返回 “Alice is a Software Engineer.”,因为alice
是Employee
的实例,所以它会使用Employee.prototype
上定义的getDetails
方法。bob.getDetails()
返回 “Bob is a person.”,因为bob
是Person
的实例,所以它会使用Person.prototype
上定义的getDetails
方法。
-
如果我们在
Employee.prototype
上添加一个新方法getSalary
,alice
能访问这个方法,但bob
无法访问。这是因为alice
是Employee
的实例,其原型链包含Employee.prototype
,而bob
是Person
的实例,其原型链不包含Employee.prototype
。 -
当我们调用
alice.constructor
时,返回值是Employee
构造函数。这是因为在继承过程中,我们将Employee.prototype.constructor
显式地设置为Employee
,从而修复了原型链中constructor
属性的引用。 -
如果我们想要为
Person
对象添加一个新的方法getAge
,可以将方法添加到Person.prototype
上,如下所示:
Person.prototype.getAge = function() {
return this.age;
};
在这种情况下,alice
和 bob
都能访问这个方法,因为它们的原型链都包含 Person.prototype
。具体来说,alice
的原型链包含 Employee.prototype
和 Person.prototype
,而 bob
的原型链直接包含 Person.prototype
原文链接:https://juejin.cn/post/7232239024106373179 作者:2002XiaoYu