注意:本文讲的是基于原型的编程范式,不是 GoF 设计模式中的 Prototype 模式。两者名字相同,但概念不同。

基于原型的编程是什么

基于原型的编程(Prototype-based programming)是面向对象编程的一种方式。与传统的基于类(class-based)的方式不同,它没有 class 的概念,对象直接从其他对象继承,又称为基于实例的编程(Instance-based programming)。

与基于类的编程的区别

基于类的编程(如 Java、C++):

  • 先定义 class(类),class 描述对象的结构和行为
  • 再通过 class 实例化出对象
  • 对象的行为由其所属的 class 决定

基于原型的编程(如 JavaScript、Lua、Self):

  • 没有 class,只有对象
  • 对象直接从另一个对象(原型)继承属性和方法
  • 可以在运行时动态修改对象,甚至修改原型

典型例子:JavaScript

JavaScript 是最广为人知的基于原型的语言。每个对象都有一个内部指针指向它的原型对象,属性查找会沿着原型链向上查找。

const animal = {
    speak() { console.log("..."); }
};

const dog = Object.create(animal); // dog 的原型是 animal
dog.speak(); // 继承自 animal

ES6 引入的 class 语法只是原型继承的语法糖,底层仍然是原型链。