当前位置:首页 > 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
分享给朋友:

相关文章

jquery.js

jquery.js

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画设计和 Ajax 交互等操作。以下是关于 jQuery.js 的核心信息和使用方法: 获取 jQ…

js实现dh

js实现dh

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

java如何实现多态

java如何实现多态

多态的概念 多态是面向对象编程的三大特性之一(封装、继承、多态),指同一操作作用于不同对象时,可以产生不同的行为。Java中主要通过方法重写(Override)和接口/抽象类实现多态。 实现…

js实现密码

js实现密码

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

js进度条实现

js进度条实现

使用HTML和CSS创建基础结构 在HTML中创建一个容器元素用于显示进度条,通常使用<div>元素。CSS用于设置进度条的样式,包括宽度、高度、颜色和圆角等属性。 <div cl…

js 实现跳转

js 实现跳转

使用 window.location.href 进行跳转 通过修改 window.location.href 可以跳转到指定 URL,浏览器会加载新页面: window.location.hre…