当前位置:首页 > JavaScript

js 实现多态

2026-04-05 11:04:49JavaScript

多态的概念

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

基于原型链的多态实现

JavaScript中每个对象都有隐藏的[[Prototype]]属性(可通过__proto__Object.getPrototypeOf()访问),当访问对象属性时,若当前对象不存在该属性,会沿原型链向上查找。

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')
const dog = new Dog('Rex')
animal.speak() // 输出 "Generic makes a noise."
dog.speak()    // 输出 "Rex barks."

基于鸭子类型的多态

JavaScript的弱类型特性允许"鸭子类型"(Duck Typing)实现多态:只要对象具有相同方法签名,即可视为同一类型。

js 实现多态

class Car {
  drive() {
    console.log('Car is driving')
  }
}

class Ship {
  drive() {
    console.log('Ship is sailing')
  }
}

function operateVehicle(vehicle) {
  vehicle.drive()
}

operateVehicle(new Car())   // 输出 "Car is driving"
operateVehicle(new Ship())  // 输出 "Ship is sailing"

使用Symbol实现多态

ES6的Symbol可以创建唯一属性键,避免属性名冲突,实现更安全的多态。

const move = Symbol('move')
class Bird {
  [move]() {
    console.log('Flying in the sky')
  }
}

class Fish {
  [move]() {
    console.log('Swimming in water')
  }
}

function animate(creature) {
  creature[move]()
}

animate(new Bird()) // 输出 "Flying in the sky"
animate(new Fish()) // 输出 "Swimming in water"

多态与高阶函数结合

通过函数作为参数传递,可以实现更灵活的多态行为。

function stringProcessor(str, processor) {
  return processor(str)
}

const upperProcessor = str => str.toUpperCase()
const reverseProcessor = str => [...str].reverse().join('')

console.log(stringProcessor('hello', upperProcessor))  // 输出 "HELLO"
console.log(stringProcessor('hello', reverseProcessor)) // 输出 "olleh"

注意事项

  • JavaScript的多态是运行时绑定(动态绑定),与编译时绑定的静态语言不同
  • 过度使用鸭子类型可能导致代码难以维护,建议结合TypeScript等工具进行类型约束
  • 原型链修改会影响所有实例,需谨慎操作

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

相关文章

js 实现vue模板

js 实现vue模板

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

js 进度条的实现

js 进度条的实现

使用 HTML 和 CSS 创建基础进度条 HTML 结构可以简单使用一个 div 元素作为容器,内部嵌套另一个 div 表示进度: <div class="progress-containe…

js实现二叉树

js实现二叉树

二叉树的基本概念 二叉树是一种树形数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉树的常见操作包括插入、删除、遍历等。 二叉树的节点定义 在JavaScript中,二叉树的节点可…

js实现变形

js实现变形

使用 CSS 和 JavaScript 实现元素变形 在 JavaScript 中实现变形效果通常结合 CSS 的 transform 属性,通过动态修改该属性实现元素的旋转、缩放、倾斜或平移。 基…

php多态实现

php多态实现

PHP 多态的实现方法 多态是面向对象编程的三大特性之一,允许不同类的对象对同一消息做出响应。PHP 主要通过以下方式实现多态: 通过继承和方法重写 子类继承父类并重写父类方法,实现不同子类对同一方…

js 实现全屏

js 实现全屏

使用 requestFullscreen 方法 通过调用元素的 requestFullscreen 方法可以实现全屏。该方法兼容现代浏览器,但不同浏览器可能需要前缀。 const element =…