在 ES5 中,类是通过构造函数和原型链来实现的。每个函数都有一个 prototype
属性,这个属性指向一个对象,该对象包含所有实例共享的属性和方法。当我们通过 new
关键字创建一个新实例时,这个实例会继承构造函数的原型对象上的属性和方法。
// 父类构造函数
function Animal(name) {
this.name = name;
}
// 父类原型方法
Animal.prototype.sayName = function() {
console.log('My name is ' + this.name);
};
// 子类构造函数
function Dog(name, breed) {
// 调用父类构造函数
Animal.call(this, name);
this.breed = breed;
}
// 设置子类的原型为父类的实例
Dog.prototype = Object.create(Animal.prototype);
// 修复子类构造函数的指向
Dog.prototype.constructor = Dog;
// 子类原型方法
Dog.prototype.sayBreed = function() {
console.log('My breed is ' + this.breed);
};
// 创建子类实例
var myDog = new Dog('Buddy', 'Golden Retriever');
// 调用继承的方法
myDog.sayName(); // 输出: My name is Buddy
myDog.sayBreed(); // 输出: My breed is Golden Retriever
问题:在继承过程中,子类实例可能会继承到不必要的父类属性。
原因:当使用 Object.create(Animal.prototype)
设置子类原型时,子类实例会继承父类的原型属性,但不会继承父类的实例属性。
解决方法:在子类构造函数中使用 Animal.call(this, name)
来调用父类构造函数,确保子类实例也能拥有父类的实例属性。
通过这种方式,可以有效地管理 JavaScript 中的继承作用域,确保代码的可维护性和扩展性。
领取专属 10元无门槛券
手把手带您无忧上云