在JavaScript中,类继承可以通过使用原型链和构造函数的组合来实现。下面是一个简单的例子:
// 父类
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