JS 中的多态:理解与实践
在面向对象编程(OOP)里,多态(Polymorphism)是一个很重要的概念。
它的核心思想是:同一个方法,可以作用于不同类型的对象,只要这些对象满足某些约定即可。
多态的特点
在 JavaScript 中,多态的体现非常自然,因为:
- JS 不会检查参数的数据类型(不像 Java、C++ 那样需要声明类型)。
- 只要对象满足某些条件(比如包含同名属性或方法),就可以被统一处理。
这就是 “鸭子类型(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 的多态依赖于 动态类型 和 鸭子类型。
- 属性多态:不同对象只要有相同的属性,就能被统一使用。
- 方法多态:不同对象实现相同方法名,就能被统一调用。
- 好处是 灵活、易扩展,不用拘泥于对象的具体类型。