当前位置:首页 > JavaScript

js 实现多态

2026-03-13 16:42:05JavaScript

多态的概念

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

基于原型链的多态实现

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

js 实现多态

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 没有接口的语法,但可以通过约定实现类似效果:

js 实现多态

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 可以创建唯一的方法名,避免属性名冲突:

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
分享给朋友:

相关文章

js实现轮播图

js实现轮播图

轮播图实现方法 基础HTML结构 <div class="slider"> <div class="slides"> <img src="image1.jpg…

js实现选项卡

js实现选项卡

实现选项卡的基本思路 选项卡通常由一组标签和对应的内容面板组成。点击标签时,显示对应的内容面板,隐藏其他面板。实现这一效果需要结合HTML结构、CSS样式和JavaScript交互逻辑。 HTML结…

js如何实现继承

js如何实现继承

原型链继承 通过将子类的原型指向父类的实例实现继承。子类实例能够访问父类原型上的属性和方法。 function Parent() { this.name = 'parent'; } Parent…

js实现延迟

js实现延迟

实现延迟的方法 在JavaScript中,实现延迟操作有多种方式,以下是几种常见的方法: 使用setTimeout函数 setTimeout是JavaScript中最常用的延迟执行方法。它接受一个回…

js实现预览

js实现预览

文件上传预览实现 使用JavaScript实现文件上传预览功能,可以通过FileReader对象读取文件内容并显示预览。以下代码支持图片、文本和PDF文件的预览: // HTML部分需要包含inpu…

js钟表实现

js钟表实现

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