JavaScript的原型继承与经典继承有何不同?
面向对象编程
经典继承和原型继承都是面向对象编程范式。面向对象编程中的对象是封装实体属性的抽象。这被称为抽象化。
在处理多个层次的抽象化时,每个层次都更加通用或更加具体。更通用的抽象化是更具体抽象化的一种泛化。
如前所述,对象是实体的抽象化。我们使用类(经典继承)或原型(原型继承)来创建这些对象的泛化。泛化是通过继承来创建的。
考虑一个例子:
- 我们有两个表示宠物的对象:狗Max和猫Claire。我们分别称它们为
max
和claire
。 - 所有的狗都有共同的特征。因此,我们可以创建一个抽象化
Dog
,它封装了它们的共同特征。我们可以使用继承将特征从Dog
传递给max
。 - 对于猫也是一样,允许我们创建一个抽象化
Cat
。类似地,claire
将从Cat
继承特征。 - 猫和狗共享一些共同的特征。我们可以创建一个泛化
Animal
来封装这些特征。Dog
和Cat
从Animal
继承这些共同特征。
经典继承
在经典面向对象编程中,有两种类型的抽象化:对象和类。对象是实体的抽象化,而类是对象或另一个类的抽象化。
如果我们使用经典继承来模拟前面的例子,它会像这样:
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';