// 父类
function Animal(name) {
this.name = name;
}
// 父类的方法
Animal.prototype.sayHello = function() {
console.log("Hello, I'm " + this.name);
};
// 子类
function Dog(name, breed) {
// 调用父类的构造函数,并绑定当前实例
Animal.call(this, name);
this.breed = breed;
}
// 使用 Object.create() 来继承父类的原型方法
Dog.prototype = Object.create(Animal.prototype);
// 设置子类的构造函数
Dog.prototype.constructor = Dog;
// 子类的方法
Dog.prototype.bark = function() {
console.log("Woof! I'm a " + this.breed);
};
// 创建子类实例
var myDog = new Dog("Buddy", "Golden Retriever");
// 调用父类方法
myDog.sayHello();
// 调用子类方法
myDog.bark();
在这个例子中,Animal 是父类,Dog 是子类。通过 Animal.call(this, name),在子类的构造函数中调用了父类的构造函数,确保子类实例拥有父类的属性。通过 Object.create(Animal.prototype),子类的原型链连接到父类的原型,实现了继承。最后,通过设置子类的构造函数,确保 instanceof 运算符的正确性。
请注意,上述示例是一种传统的原型链继承方式,ES6 引入了 class 关键字,提供了更简洁的语法糖来实现类和继承。以下是使用 ES6 class 实现的同样功能的例子:
class Animal {
constructor(name) {
this.name = name;
}
sayHello() {
console.log(`Hello, I'm ${this.name}`);
}
}
class Dog extends Animal {
constructor(name, breed) {
super(name); // 调用父类的构造函数
this.breed = breed;
}
bark() {
console.log(`Woof! I'm a ${this.breed}`);
}
}
// 创建子类实例
const myDog = new Dog("Buddy", "Golden Retriever");
// 调用父类方法
myDog.sayHello();
// 调用子类方法
myDog.bark();
使用 ES6 class 更加简洁,但本质上仍然是基于原型链的继承。
转载请注明出处:http://www.pingtaimeng.com/article/detail/12817/JavaScript