「JS 面向对象」多态详解:鸭子类型的魅力

100 阅读1分钟

JS 中的多态:理解与实践

在面向对象编程(OOP)里,多态(Polymorphism)是一个很重要的概念。
它的核心思想是:同一个方法,可以作用于不同类型的对象,只要这些对象满足某些约定即可。


多态的特点

JavaScript 中,多态的体现非常自然,因为:

  1. JS 不会检查参数的数据类型(不像 Java、C++ 那样需要声明类型)。
  2. 只要对象满足某些条件(比如包含同名属性或方法),就可以被统一处理。

这就是 “鸭子类型(Duck Typing)”
“如果它走起来像鸭子,叫起来也像鸭子,那它就是一只鸭子。”


示例代码

class Dog {
  name = '阿达'
}

class Person {
  name = 'Alice'
}

function sayHello(obj) {
  console.log(`你好,我是 ${obj.name}`)
}

const person = new Person()
const dog = new Dog()

sayHello(person) // 输出:你好,我是 Alice
sayHello(dog)    // 输出:你好,我是 阿达

这里 sayHello 不关心传入的对象是不是 Dog 还是 Person
它只要确保对象里有 name 属性,就能正常运行。


多态的进一步应用

除了属性,还可以针对 方法 来实现多态:

class Cat {
  speak() {
    console.log('喵喵~')
  }
}

class Dog {
  speak() {
    console.log('汪汪~')
  }
}

function makeSound(animal) {
  // 不关心 animal 的具体类型
  animal.speak()
}

makeSound(new Cat()) // 喵喵~
makeSound(new Dog()) // 汪汪~

这种方式就是典型的 方法多态
只要对象实现了 speak 方法,就能传给 makeSound 使用。


小结

  • JS 的多态依赖于 动态类型鸭子类型
  • 属性多态:不同对象只要有相同的属性,就能被统一使用。
  • 方法多态:不同对象实现相同方法名,就能被统一调用。
  • 好处是 灵活易扩展,不用拘泥于对象的具体类型。