- 具体步骤:
- 步骤一:创建父类构造函数
定义一个函数作为父类的构造函数,在这个函数内部可以初始化父类的属性。
- 步骤二:为父类构造函数添加原型方法
通过给父类构造函数的
prototype
对象添加方法,这些方法会被所有实例共享。
- 步骤三:创建子类构造函数
定义一个函数作为子类的构造函数,在子类构造函数内部可以初始化子类特有的属性,同时需要调用父类构造函数,以继承父类的属性。
- 步骤四:设置子类的原型
将子类的原型设置为父类的一个实例,这样子类就可以通过原型链访问父类的原型方法。为了避免修改子类原型时影响父类,通常会使用
Object.create()
方法来创建一个以父类实例为原型的新对象,并将其赋值给子类的prototype
。
- 步骤五:修正子类的构造函数指向
由于步骤四中设置了子类的原型,此时子类的
prototype.constructor
指向的是父类构造函数,需要手动将其修正为子类构造函数。
- 示例代码:
// 步骤一:创建父类构造函数
function Animal(name) {
this.name = name;
}
// 步骤二:为父类构造函数添加原型方法
Animal.prototype.speak = function() {
console.log(this.name +'makes a sound.');
};
// 步骤三:创建子类构造函数
function Dog(name, breed) {
// 调用父类构造函数以继承父类属性
Animal.call(this, name);
this.breed = breed;
}
// 步骤四:设置子类的原型
Dog.prototype = Object.create(Animal.prototype);
// 步骤五:修正子类的构造函数指向
Dog.prototype.constructor = Dog;
// 创建子类实例
const myDog = new Dog('Buddy', 'Golden Retriever');
myDog.speak();// 调用从父类继承的方法
console.log(myDog.breed);// 访问子类特有的属性