当前位置: 首页 > news >正文

JavaScript案例0323

以下是一些涵盖不同高级JavaScript概念的案例,结合了现代特性、设计模式和底层原理:


案例1:基于Proxy的响应式数据系统(类似Vue3核心)

// 创建响应式系统
function reactive(target) {
  const handler = {
    get(obj, key, receiver) {
      track(obj, key);
      return Reflect.get(obj, key, receiver);
    },
    set(obj, key, value, receiver) {
      Reflect.set(obj, key, value, receiver);
      trigger(obj, key);
      return true;
    }
  };
  return new Proxy(target, handler);
}

// 依赖跟踪与触发
const targetMap = new WeakMap();
let activeEffect = null;

function track(target, key) {
  if (activeEffect) {
    let depsMap = targetMap.get(target);
    if (!depsMap) {
      targetMap.set(target, (depsMap = new Map()));
    }
    let dep = depsMap.get(key);
    if (!dep) {
      depsMap.set(key, (dep = new Set()));
    }
    dep.add(activeEffect);
  }
}

function trigger(target, key) {
  const depsMap = targetMap.get(target);
  if (!depsMap) return;
  const effects = depsMap.get(key);
  effects && effects.forEach(effect => effect());
}

// 使用示例
const state = reactive({ count: 0 });

function effect(fn) {
  activeEffect = fn;
  fn();
  activeEffect = null;
}

effect(() => {
  console.log(`Count changed: ${state.count}`);
});

state.count++; // 触发日志输出

技术点

  • Proxy/Reflect实现数据劫持
  • 依赖收集与发布订阅模式
  • WeakMap进行内存管理

案例2:Web Worker + OffscreenCanvas图像处理

// 主线程
const canvas = document.querySelector('canvas');
const offscreen = canvas.transferControlToOffscreen();
const worker = new Worker('worker.js');

worker.postMessage({ canvas: offscreen }, [offscreen]);

// worker.js
self.onmessage = function(e) {
  const canvas = e.data.canvas;
  const ctx = canvas.getContext('2d');
  
  // 图像处理算法
  function processImage() {
    const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);
    const data = imageData.data;
    
    // 灰度化处理
    for(let i = 0; i < data.length; i += 4) {
      const avg = (data[i] + data[i+1] + data[i+2]) / 3;
      data[i] = avg;
      data[i+1] = avg;
      data[i+2] = avg;
    }
    
    ctx.putImageData(imageData, 0, 0);
  }
  
  // 模拟实时处理
  setInterval(processImage, 100);
}

技术点

  • 多线程编程
  • OffscreenCanvas API
  • 图像数据处理
  • 内存转移(transferable objects)

案例3:基于Generator的协程调度器

class Scheduler {
  constructor() {
    this.queue = [];
    this.isRunning = false;
  }

  add(generatorFn) {
    this.queue.push(generatorFn);
    if (!this.isRunning) this.run();
  }

  async run() {
    this.isRunning = true;
    while (this.queue.length > 0) {
      const gen = this.queue.shift()();
      for await (const _ of gen) {
        // 每个yield让出执行权
        await new Promise(resolve => setTimeout(resolve, 0));
      }
    }
    this.isRunning = false;
  }
}

// 使用示例
const scheduler = new Scheduler();

function* task1() {
  console.log('Task 1 start');
  yield;
  console.log('Task 1 middle');
  yield;
  console.log('Task 1 end');
}

function* task2() {
  console.log('Task 2 start');
  yield;
  console.log('Task 2 end');
}

scheduler.add(task1);
scheduler.add(task2);

/* 输出:
Task 1 start
Task 2 start
Task 1 middle
Task 2 end
Task 1 end
*/

技术点

  • Generator函数控制执行流程
  • 协程调度实现
  • 模拟并发执行

案例4:WebGL数据可视化(3D散点图)

<canvas id="glCanvas"></canvas>
<script>
const vertexShaderSource = `
  attribute vec3 position;
  uniform mat4 modelViewMatrix;
  uniform mat4 projectionMatrix;
  
  void main() {
    gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
    gl_PointSize = 5.0;
  }
`;

const fragmentShaderSource = `
  void main() {
    gl_FragColor = vec4(1.0, 0.5, 0.2, 1.0);
  }
`;

// 初始化WebGL上下文
const canvas = document.getElementById('glCanvas');
const gl = canvas.getContext('webgl');

// 创建着色器程序
const program = initShaderProgram(gl, vertexShaderSource, fragmentShaderSource);

// 生成随机三维数据
const points = Array.from({length: 1000}, () => [
  Math.random()*2-1, 
  Math.random()*2-1,
  Math.random()*2-1
]).flat();

// 创建缓冲区
const positionBuffer = gl.createBuffer();
gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
gl.bufferData(gl.ARRAY_BUFFER, new Float32Array(points), gl.STATIC_DRAW);

// 渲染循环
function render() {
  gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
  
  const positionAttr = gl.getAttribLocation(program, 'position');
  gl.enableVertexAttribArray(positionAttr);
  gl.bindBuffer(gl.ARRAY_BUFFER, positionBuffer);
  gl.vertexAttribPointer(positionAttr, 3, gl.FLOAT, false, 0, 0);
  
  gl.drawArrays(gl.POINTS, 0, points.length / 3);
  requestAnimationFrame(render);
}

// 初始化视图矩阵等...
initCamera();
render();
</script>

技术点

  • WebGL底层API使用
  • GLSL着色器编程
  • 大规模数据渲染
  • 三维坐标系处理

案例5:实现一个微型前端框架

class MiniFramework {
  constructor(config) {
    this.state = reactive(config.state);
    this.methods = config.methods;
    this.element = document.querySelector(config.el);
    this.template = config.template;
    
    this.compile();
    this.proxyMethods();
  }

  compile() {
    const regex = /{{(.*?)}}/g;
    const html = this.template.replace(regex, (_, key) => {
      return this.state[key.trim()];
    });
    
    this.element.innerHTML = html;
    
    // 事件绑定
    this.element.querySelectorAll('[@click]').forEach(el => {
      const method = el.getAttribute('@click').trim();
      el.addEventListener('click', this.methods[method].bind(this));
    });
  }

  proxyMethods() {
    Object.keys(this.methods).forEach(key => {
      this[key] = (...args) => {
        this.methods[key].apply(this, args);
        this.compile(); // 简单粗暴的重新渲染
      };
    });
  }
}

// 使用示例
new MiniFramework({
  el: '#app',
  state: { count: 0 },
  methods: {
    increment() {
      this.state.count++;
    }
  },
  template: `
    <div>
      <h1>{{ count }}</h1>
      <button @click="increment">+</button>
    </div>
  `
});

技术点

  • 响应式系统集成
  • 模板编译原理
  • 事件委托处理
  • 简易虚拟DOM思想

这些案例覆盖了以下高级主题:

  1. 元编程(Proxy/Reflect)
  2. 多线程与性能优化
  3. 异步流程控制
  4. 图形编程与WebGL
  5. 框架设计原理
  6. 函数式编程模式
  7. 内存管理技巧
  8. 底层浏览器API运用

相关文章:

  • 【LC插件开发】基于Java实现FSRS(自由间隔重复调度算法)
  • 虚拟机第二章-类加载子系统
  • c++之迭代器
  • Java 安装开发环境(Mac Apple M1 Pro)
  • Linux Namespace(网络命名空间)系列三 --- 使用 Open vSwitch 和 VLAN 标签实现网络隔离
  • 【Centos7搭建Zabbix4.x监控HCL模拟网络设备:zabbix-server搭建及监控基础05
  • 专题|Python贝叶斯网络BN动态推理因果建模:MLE/Bayes、有向无环图DAG可视化分析呼吸疾病、汽车效能数据2实例合集
  • 实战指南:使用 OpenRewrite 将 Spring Boot 项目从 JDK 8 升级到 JDK
  • 嵌入式项目:利用心知天气获取天气数据实验方案
  • 从指令集鸿沟到硬件抽象:AI 如何重塑手机与电脑编程语言差异——PanLang 原型全栈设计方案与实验性探索1
  • Coze:一场颠覆传统编程的「无界革命」
  • 企业级前端架构设计与实战
  • 电子签的法律效力、业务合规与监管难点
  • 3、linux基本操作1
  • MySQL数据库基础篇
  • 【MySQL】日志
  • QT三 自定义控件
  • Web PKI现行应用、标准
  • 走进底层-Java中的IO流
  • JavaScript-作用域、函数进阶、解构赋值、filter详解
  • 远洋渔船上的命案
  • 广东缉捕1名象牙走私潜逃非洲“红通”逃犯
  • 视频丨歼-10CE首次实战大放异彩
  • 上市公司重大资产重组新规九要点:引入私募“反向挂钩”,压缩审核流程
  • 对谈|“大礼议”:嘉靖皇帝的礼法困境与权力博弈
  • 科技部等七部门:优先支持取得关键核心技术突破的科技型企业上市融资