📜  javascript 类继承 - Javascript (1)

📅  最后修改于: 2023-12-03 15:01:45.763000             🧑  作者: Mango

JavaScript 类继承

在面向对象的编程中,继承可以让子类拥有父类的特性和方法,并且可以扩展自己的功能。在 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

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 来实现类和继承,它更加规范、易读和易用。但是,在一些低版本的浏览器中可能不兼容,此时可以使用组合继承。原型链继承和构造函数继承不建议使用。