首先,需要了解JS中的对象和原型的概念。在JS中,每个对象都有一个隐式的原型指向其构造函数的原型,构成了原型链。原型链可以实现对象间的继承,利用原型链可以实现JS中的“类”的概念。
具体的实现继承的方式有两种,一种是通过构造函数的原型,另一种是通过call和apply方法。下面将对两种方式进行详细说明。
- 利用构造函数的原型实现继承
可以通过父类的构造函数添加属性和方法,然后将其原型赋值给子类的原型,实现子类继承父类的属性和方法。
// 父类
function Animal(type) {
this.type = type;
}
Animal.prototype.eat = function() {
console.log('Animal is eating');
}
// 子类
function Cat(name) {
Animal.call(this, 'Cat');
this.name = name;
}
// 子类的实例可以调用父类的方法
let cat = new Cat('Tom');
cat.eat(); // error, cat.eat is not a function
// 将子类的原型指向父类的原型
Cat.prototype = Object.create(Animal.prototype);
Cat.prototype.constructor = Cat;
// 现在子类的实例可以调用父类的方法了
cat.eat(); // Animal is eating
// 子类也可以添加自己的方法
Cat.prototype.meow = function() {
console.log(this.name + ' is meowing');
}
cat.meow(); // Tom is meowing
- 利用call和apply方法实现继承
可以通过子类的构造函数中调用父类的构造函数,利用call或apply方法将父类的属性和方法赋值给子类。
// 父类
function Animal(type) {
this.type = type;
}
Animal.prototype.eat = function() {
console.log('Animal is eating');
}
// 子类
function Cat(name) {
Animal.call(this, 'Cat');
this.name = name;
}
// 子类的实例可以调用父类的方法了
let cat = new Cat('Tom');
cat.eat(); // Animal is eating
// 子类也可以添加自己的方法了
Cat.prototype.meow = function() {
console.log(this.name + ' is meowing');
}
cat.meow(); // Tom is meowing
最后,需要注意的是,在JS中,对象间的继承不是真正意义上的继承,而是对象间的原型链。因此,在实现继承时,需要注意可能会影响到原型链。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS学习笔记之原型链和利用原型实现继承详解 - Python技术站