📅  最后修改于: 2023-12-03 15:01:45.763000             🧑  作者: Mango
在面向对象的编程中,继承可以让子类拥有父类的特性和方法,并且可以扩展自己的功能。在 JavaScript 中,可以通过以下方式实现类继承:
原型链继承是 JavaScript 中最基本的继承方式,可以通过将子类的原型设置为父类的实例来实现。代码如下:
function Animal(name) {
this.name = name;
this.sleep = function() {
console.log(this.name + '正在睡觉!');
};
}
Animal.prototype.eat = function(food) {
console.log(this.name + '正在吃' + food + '!');
};
function Cat(name) {}
Cat.prototype = new Animal();
Cat.prototype.constructor = Cat;
var cat = new Cat('Tom');
console.log(cat.name); // 'Tom'
cat.eat('fish'); // 'Tom正在吃fish!'
cat.sleep(); // 'Tom正在睡觉!'
注意这种方式的缺点是,在创建子类实例的时候,不能给父类的构造函数传参,因为子类的原型是父类的实例,所以会覆盖掉属性值。
构造函数继承是通过在子类构造函数中使用 apply 或者 call 方法,将父类的构造函数绑定在子类实例上,从而实现继承。代码如下:
function Animal(name) {
this.name = name;
this.sleep = function() {
console.log(this.name + '正在睡觉!');
};
}
Animal.prototype.eat = function(food) {
console.log(this.name + '正在吃' + food + '!');
};
function Cat(name) {
Animal.call(this, name);
}
var cat = new Cat('Tom');
console.log(cat.name); // 'Tom'
cat.sleep(); // 'Tom正在睡觉!'
注意这种方式的缺点是,父类原型上的方法和属性并没有被子类继承下来。
组合继承是结合了原型链继承和构造函数继承两种方式的继承方式,即使用构造函数继承父类的属性和方法,使用原型链继承父类的原型方法和属性。代码如下:
function Animal(name) {
this.name = name;
this.sleep = function() {
console.log(this.name + '正在睡觉!');
};
}
Animal.prototype.eat = function(food) {
console.log(this.name + '正在吃' + food + '!');
};
function Cat(name) {
Animal.call(this, name);
}
Cat.prototype = new Animal();
Cat.prototype.constructor = Cat;
var cat = new Cat('Tom');
console.log(cat.name); // 'Tom'
cat.eat('fish'); // 'Tom正在吃fish!'
cat.sleep(); // 'Tom正在睡觉!'
这种方式可以避免原型链继承和构造函数继承各自的缺点。
ES6 引入了 Class 关键字,使 JavaScript 的面向对象编程更加规范和易用。使用 Class 可以很方便地定义一个类,并且可以使用 extends 关键字来实现继承。代码如下:
class Animal {
constructor(name) {
this.name = name;
}
eat(food) {
console.log(this.name + '正在吃' + food + '!');
}
sleep() {
console.log(this.name + '正在睡觉!');
}
}
class Cat extends Animal {
constructor(name) {
super(name);
}
}
var cat = new Cat('Tom');
console.log(cat.name); // 'Tom'
cat.eat('fish'); // 'Tom正在吃fish!'
cat.sleep(); // 'Tom正在睡觉!'
推荐使用 ES6 Class 来实现类和继承,它更加规范、易读和易用。但是,在一些低版本的浏览器中可能不兼容,此时可以使用组合继承。原型链继承和构造函数继承不建议使用。