当前位置:首页 > 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实现日历

实现日历的基本思路 使用JavaScript实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

原生js实现轮播图

原生js实现轮播图

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

js实现换肤

js实现换肤

使用CSS变量实现换肤 通过CSS变量可以轻松实现主题切换功能。CSS变量在根元素中定义,通过JavaScript动态修改这些变量值。 :root { --primary-color: #349…

js实现图表

js实现图表

在JavaScript中实现图表通常使用流行的图表库,以下是几种常见的方法和工具: 使用Chart.js Chart.js是一个简单灵活的库,适合快速生成响应式图表。安装方式包括CDN引入或npm安…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js实现dh

js实现dh

JavaScript 实现 DH(Diffie-Hellman)密钥交换 Diffie-Hellman(DH)密钥交换是一种安全协议,允许双方在不安全的通信信道上建立一个共享密钥。以下是如何在 Jav…