面试题答案
一键面试// 定义Animal构造函数
function Animal(name) {
this.name = name;
}
// 定义Animal的speak方法
Animal.prototype.speak = function() {
console.log(this.name +'makes a sound.');
};
// 定义Dog构造函数
function Dog(name) {
// 借用Animal的构造函数初始化name属性
Animal.call(this, name);
}
// 设置Dog的原型为Animal的实例,建立原型链
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
// 重写Dog的speak方法
Dog.prototype.speak = function() {
console.log(this.name +'barks.');
};
// 定义Cat构造函数
function Cat(name) {
// 借用Animal的构造函数初始化name属性
Animal.call(this, name);
}
// 设置Cat的原型为Animal的实例,建立原型链
Cat.prototype = Object.create(Animal.prototype);
Cat.prototype.constructor = Cat;
// 重写Cat的speak方法
Cat.prototype.speak = function() {
console.log(this.name +'meows.');
};
// 优化避免重复定义方法
// 1. 公共方法定义在Animal.prototype上,子构造函数通过原型链继承,这样公共方法只会存在一份
// 2. 借用父构造函数初始化属性,避免在子构造函数中重复定义属性初始化逻辑
说明:
- 原型链继承实现:
- 通过
Object.create
方法创建一个以Animal.prototype
为原型的新对象,并将其赋值给Dog.prototype
和Cat.prototype
,从而建立原型链关系。 - 使用
Animal.call(this, name)
在子构造函数中调用父构造函数,初始化name
属性,这样每个实例都有自己独立的name
属性。 - 为
Dog.prototype
和Cat.prototype
分别重写speak
方法,实现各自独特的行为。
- 通过
- 优化避免重复定义方法:
- 将公共方法
speak
定义在Animal.prototype
上,Dog
和Cat
通过原型链继承该方法,而不是在每个子构造函数的实例上重复定义,减少内存开销。 - 在子构造函数中通过
Animal.call(this, name)
借用父构造函数初始化name
属性,避免在子构造函数中重复编写属性初始化代码。
- 将公共方法