Skip to content

JavaScript的原型继承与经典继承有何不同?

面向对象编程

经典继承和原型继承都是面向对象编程范式。面向对象编程中的对象是封装实体属性的抽象。这被称为抽象化。

在处理多个层次的抽象化时,每个层次都更加通用或更加具体。更通用的抽象化是更具体抽象化的一种泛化。

如前所述,对象是实体的抽象化。我们使用类(经典继承)或原型(原型继承)来创建这些对象的泛化。泛化是通过继承来创建的。

考虑一个例子:

  • 我们有两个表示宠物的对象:狗Max和猫Claire。我们分别称它们为maxclaire
  • 所有的狗都有共同的特征。因此,我们可以创建一个抽象化Dog,它封装了它们的共同特征。我们可以使用继承将特征从Dog传递给max
  • 对于猫也是一样,允许我们创建一个抽象化Cat。类似地,claire将从Cat继承特征。
  • 猫和狗共享一些共同的特征。我们可以创建一个泛化Animal来封装这些特征。DogCatAnimal继承这些共同特征。

经典继承

在经典面向对象编程中,有两种类型的抽象化:对象和类。对象是实体的抽象化,而类是对象或另一个类的抽象化。

如果我们使用经典继承来模拟前面的例子,它会像这样:

class Animal { }

class Dog extends Animal { }
class Cat extends Animal { }

const max = new Dog();
max.name = 'Max';

const claire = new Cat();
claire.name = 'Claire';

原型继承

在原型继承的面向对象编程中,只有一种抽象类型:对象。对象可以是实体或其他对象的抽象,如果是其他对象的抽象,则称为原型。因此,原型是一种概括。

对象可以从无中创建,也可以从另一个对象创建,而后者成为新创建对象的原型。

如果我们使用原型继承来模拟前面的示例,代码如下所示:

const animal = {};

const dog = Object.create(animal);
const cat = Object.create(animal);

const max = Object.create(dog); max.name = 'Max';

const claire = Object.create(cat); claire.name = 'Claire'; ```

const max = Object.create(dog); max.name = 'Max';

const claire = Object.create(cat); claire.name = 'Claire';