当前位置:首页 > JavaScript

js 实现多态

2026-01-31 18:48:15JavaScript

多态的概念

多态是面向对象编程的三大特性之一(封装、继承、多态),指同一操作作用于不同对象时会产生不同的行为。在JavaScript中,由于是动态类型语言,多态的实现方式与静态类型语言(如Java/C++)有所不同。

基于原型链的多态实现

JavaScript通过原型链实现继承,多态的表现形式为子类可以覆盖父类的方法:

class Animal {
  makeSound() {
    console.log('Some generic animal sound');
  }
}

class Dog extends Animal {
  makeSound() {
    console.log('Bark!');
  }
}

class Cat extends Animal {
  makeSound() {
    console.log('Meow!');
  }
}

const animals = [new Animal(), new Dog(), new Cat()];
animals.forEach(animal => animal.makeSound());
// 输出:
// Some generic animal sound
// Bark!
// Meow!

基于鸭子类型的多态

JavaScript不检查对象类型,而是关注对象是否具有所需的方法或属性("如果它走起来像鸭子,叫起来像鸭子,那么它就是鸭子"):

function makeSound(animal) {
  if (animal && typeof animal.sound === 'function') {
    animal.sound();
  }
}

const duck = {
  sound: () => console.log('Quack!')
};

const robot = {
  sound: () => console.log('Beep boop!')
};

makeSound(duck);   // Quack!
makeSound(robot);  // Beep boop!

通过参数多态实现

利用JavaScript的动态类型特性,函数可以根据传入参数的不同类型表现不同行为:

function calculateArea(shape) {
  if (shape.type === 'circle') {
    return Math.PI * shape.radius  2;
  } else if (shape.type === 'rectangle') {
    return shape.width * shape.height;
  }
}

console.log(calculateArea({ type: 'circle', radius: 5 }));      // 78.5398...
console.log(calculateArea({ type: 'rectangle', width: 4, height: 6 }));  // 24

使用Symbol实现多态

ES6的Symbol可以创建唯一属性键,实现更安全的多态:

js 实现多态

const soundSymbol = Symbol('sound');

class Bird {
  [soundSymbol]() {
    console.log('Chirp!');
  }
}

class Helicopter {
  [soundSymbol]() {
    console.log('Whirr!');
  }
}

function playSound(entity) {
  if (entity[soundSymbol]) {
    entity[soundSymbol]();
  }
}

playSound(new Bird());        // Chirp!
playSound(new Helicopter());  // Whirr!

多态的实际应用场景

  1. 插件系统:不同插件实现相同接口方法
  2. UI组件:不同组件实现相同的render方法
  3. 中间件模式:多个中间件实现相同的处理接口
  4. 游戏开发:不同游戏对象实现相同的update/draw方法

JavaScript的多态实现更加灵活,不需要显式接口定义,只需对象具有相应的方法或属性即可实现多态行为。这种动态特性使得代码更易于扩展和维护。

标签: 多态js
分享给朋友:

相关文章

js实现倒计时

js实现倒计时

使用 setInterval 实现倒计时 通过 setInterval 定时器每秒更新剩余时间,适用于简单倒计时场景。 function countdown(seconds, callbac…

原生js实现轮播图

原生js实现轮播图

基本结构搭建 HTML部分需要包含轮播图容器、图片列表及导航按钮。结构示例如下: <div class="slider-container"> <div class="slid…

js实现验证

js实现验证

验证表单输入 使用JavaScript验证表单输入是常见的需求。可以通过监听表单提交事件,检查输入字段是否符合要求。 document.getElementById('myForm').addEve…

js实现类

js实现类

JavaScript 实现类的几种方式 JavaScript 是一种基于原型的语言,但在 ES6 之后引入了 class 语法糖,使得实现类更加直观。以下是几种常见的实现方式: 使用构造函数 传统的…

js实现选题

js实现选题

实现选题功能的JavaScript方法 基础实现方案 使用数组存储选项,通过随机索引选取: const options = ['选项A', '选项B', '选项C', '选项D']; const r…

js实现求导

js实现求导

实现数值求导的方法 在JavaScript中实现求导通常采用数值方法,因为JavaScript不是符号计算语言。以下是常见的数值微分方法: 中心差分法 中心差分法提供较高精度的导数近似: func…