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

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运用

http://www.kler.cn/a/598490.html

相关文章:

  • 【Git】用Git命令克隆一个远程仓库、修改仓库中的文件,并将更改推送到远程仓库
  • 图论 | 岛屿数量(深搜,广搜)
  • 虾皮(Shopee)商品ID获取商品详情请求示例
  • Android Compose 约束布局(ConstraintLayout、Modifier.constrainAs)源码深度剖析(十二)
  • 【完整版】DeepSeek-R1大模型学习笔记(架构、训练、Infra、复现代码)
  • SQL的DCL,DDL,DML和DQL分别是什么
  • 2025-03-21 Unity 序列化 —— 自定义2进制序列化
  • 面试常问系列(一)-神经网络参数初始化
  • NLP高频面试题(十一)——RLHF的流程有哪些
  • ModuleNotFoundError: No module named ‘flask‘ 错误
  • 堆的相关要点以及模拟实现
  • 《可爱风格 2048 游戏项目:HTML 实现全解析》
  • 前后端开发概述:架构、技术栈与未来趋势
  • Linux系统移植篇(十)根文件系统构建 V3 - Yocto
  • 第8章:Docker数据持久化与卷管理
  • 基于Matlab的大气湍流光束传输特性的研究
  • Android Compose 层叠布局(ZStack、Surface)源码深度剖析(十三)
  • Android 根据Url使用Retrofit框架进行文件下载
  • 从复杂到集成:APVSG系列多通道相参矢量信号源重塑量子比特(Qubit )信号生成技术
  • qt 对QObject::tr()函数进行重定向