当前位置:首页 > 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可以创建唯一属性键,实现更安全的多态:

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实现倒计时

js实现倒计时

实现倒计时的基本方法 使用 JavaScript 实现倒计时功能可以通过 setInterval 或 setTimeout 结合日期计算来完成。以下是几种常见的实现方式: 使用 setInterva…

js 实现vue模板

js 实现vue模板

实现 Vue 模板的 JavaScript 方法 通过原生 JavaScript 可以实现类似 Vue 的模板渲染功能,主要包括数据绑定、指令处理和模板解析。以下是核心实现思路: 数据绑定与响应式…

js实现轮播图

js实现轮播图

基础轮播图实现 使用HTML、CSS和JavaScript实现一个简单的自动轮播图。HTML结构包含一个容器和多个图片项。 <div class="slider"> <div…

js实现图片轮播

js实现图片轮播

实现基础图片轮播 使用HTML、CSS和JavaScript创建一个简单的图片轮播。HTML部分定义轮播容器和图片,CSS设置样式和动画效果,JavaScript处理轮播逻辑。 <div c…

原生js实现轮播图

原生js实现轮播图

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

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…