当前位置:首页 > JavaScript

js 实现多态

2026-03-13 16:42:05JavaScript

多态的概念

多态是面向对象编程的核心特性之一,指同一操作作用于不同对象时会产生不同的行为。JavaScript 通过原型链和动态类型实现多态,无需像传统语言(如 Java)那样依赖严格的类继承体系。

基于原型链的多态实现

JavaScript 通过原型链实现继承,子类可以重写父类方法以实现多态行为:

function Animal(name) {
  this.name = name;
}

Animal.prototype.speak = function() {
  console.log(this.name + ' makes a noise.');
};

function Dog(name) {
  Animal.call(this, name);
}

Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;

// 重写父类方法
Dog.prototype.speak = function() {
  console.log(this.name + ' barks.');
};

const animal = new Animal('Generic Animal');
const dog = new Dog('Buddy');

animal.speak(); // 输出: "Generic Animal makes a noise."
dog.speak();    // 输出: "Buddy barks."

基于接口的多态模拟

JavaScript 没有接口的语法,但可以通过约定实现类似效果:

class Shape {
  area() {
    throw new Error('Method "area()" must be implemented.');
  }
}

class Circle extends Shape {
  constructor(radius) {
    super();
    this.radius = radius;
  }

  area() {
    return Math.PI * this.radius  2;
  }
}

class Square extends Shape {
  constructor(side) {
    super();
    this.side = side;
  }

  area() {
    return this.side  2;
  }
}

const shapes = [new Circle(2), new Square(5)];
shapes.forEach(shape => console.log(shape.area()));

鸭子类型实现多态

JavaScript 的动态类型系统允许通过"鸭子类型"(Duck Typing)实现多态,只需对象具有所需方法即可:

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

const dog = {
  makeSound: () => console.log('Woof!')
};

const cat = {
  makeSound: () => console.log('Meow!')
};

logSound(dog); // 输出: "Woof!"
logSound(cat); // 输出: "Meow!"

使用 Symbol 实现多态

ES6 的 Symbol 可以创建唯一的方法名,避免属性名冲突:

js 实现多态

const speak = Symbol('speak');

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

class Parrot extends Bird {
  [speak]() {
    console.log('Polly wants a cracker!');
  }
}

const bird = new Bird();
const parrot = new Parrot();

bird[speak]();   // 输出: "Chirp!"
parrot[speak](); // 输出: "Polly wants a cracker!"

多态的应用场景

  1. 插件系统:不同插件实现相同接口但行为不同
  2. UI 组件:不同组件响应相同事件但表现不同
  3. 数据处理:不同数据源实现相同解析接口
  4. 游戏开发:不同角色对同一指令做出不同反应

JavaScript 的多态实现更加灵活,不需要严格的类型系统,通过检查对象是否具有特定方法或属性即可实现多态行为。这种动态特性使得代码更具扩展性和适应性。

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

相关文章

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js实现图片上传

js实现图片上传

图片上传的基本实现 使用HTML的<input type="file">元素配合JavaScript的File API可以实现图片上传功能。HTML部分需要创建一个文件选择输入框和一个用于…

js钟表实现

js钟表实现

实现JavaScript钟表的基本方法 创建一个简单的JavaScript钟表可以通过以下步骤完成,涵盖数字和模拟两种形式。 数字钟表实现 HTML结构只需一个显示时间的容器: <div i…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…

vue实现js休眠

vue实现js休眠

实现 JavaScript 休眠的方法 在 Vue 中实现 JavaScript 休眠(延迟执行)可以通过以下方式实现。由于 JavaScript 本身没有内置的 sleep 函数,通常使用 Prom…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…