欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > 能源 > JavaScript案例0323

JavaScript案例0323

2025/3/26 17:36:34 来源:https://blog.csdn.net/liudadaxuexi/article/details/146464876  浏览:    关键词: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运用

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词