跳至主要內容

原型与原型链


原型与原型链

介绍

在ECMAScript中,每个对象都有一个原型(prototype)对象,原型对象包含对象的属性和方法。如果一个对象的属性或方法在自身上不存在,它会去查找原型对象上是否存在该属性或方法,如果原型对象上也不存在,则会继续查找原型对象的原型对象,直到查找到Object.prototype对象为止,这个查找过程就是原型链(prototype chain)。

原型链是一种对象间的关系链,用于实现对象的继承和属性的共享。通过原型链,我们可以将一个对象的属性和方法共享给所有继承它的子对象,从而达到代码复用和扩展的目的。

在ECMAScript中,对象的原型可以通过__proto__属性来访问和修改,也可以使用Object.getPrototypeOf()和Object.setPrototypeOf()方法来访问和修改。类的原型可以通过静态属性prototype来访问和修改。

ECMAScript 6引入了class语法糖,使得对象和类的原型更加易于理解和使用。在类中,可以使用extends关键字来继承其他类,从而实现对象和类的继承和属性共享。

总之,在ECMAScript中,原型和原型链是实现对象间继承和属性共享的重要机制,掌握原型和原型链的使用和原理对于ECMAScript编程非常重要。

举例

假设我们有一个Animal类和一个Cat类,Cat类继承自Animal类。我们希望在Cat类中重写Animal类的eat方法,并且在重写的eat方法中调用Animal类的eat方法。这时候就可以使用原型链来实现。

// 定义Animal类
function Animal(name) {
  this.name = name;
}

// 定义Animal类的方法
Animal.prototype.eat = function() {
  console.log(this.name + ' is eating.');
}

// 定义Cat类
function Cat(name) {
  Animal.call(this, name);
}

// 继承Animal类
Cat.prototype = Object.create(Animal.prototype);
Cat.prototype.constructor = Cat;

// 重写eat方法并调用Animal类的eat方法
Cat.prototype.eat = function() {
  console.log(this.name + ' is eating.');
  Animal.prototype.eat.call(this);
}

// 创建Cat对象
var cat = new Cat('Tom');

// 调用Cat对象的eat方法
cat.eat();

在上述例子中,定义了一个Animal类和一个Cat类,Cat类继承自Animal类。在Cat类中重写了Animal类的eat方法,并在重写的eat方法中调用了Animal类的eat方法。通过原型链,Cat类可以访问和调用Animal类的方法,从而实现了代码的复用和扩展。

上次编辑于:
贡献者: Neil