公司动态
JS这门语言是面向对象的还是面向过程的呢?
*显然JS这门语言是面向对象的但对于DOM的操作体现了面向过程的思想JavaScript 这门语言本身是支持面向对象OOP的但我们在用它操作 DOM 时却往往被迫或习惯性地采用了面向过程的思维。我们可以从以下几个维度来深度拆解这个现象1. JS 语言本身确实有“面向对象”的基因JavaScript 是一门基于原型的语言它完全支持面向对象的三大特性封装你可以用class关键字定义类把数据和行为打包在一起。继承子类可以继承父类的属性和方法。多态不同的对象可以对同一方法做出不同的反应。甚至在 JS 的底层DOM 节点本身就是一个巨大的“对象”。当你打印document.body时你会看到它拥有appendChild、addEventListener等方法这其实就是面向对象中“对象拥有行为”的体现。2. 为什么操作 DOM 变成了“面向过程”虽然 DOM 节点是对象但当我们写代码去操作它时思维模式却发生了偏移。这主要是因为DOM API 的设计历史和操作逻辑的线性特征。历史包袱API 设计DOM 的 API如getElementById、querySelector是在很多年前设计的。那时候的编程范式更偏向过程式。这些 API 就像是提供给你的一把把“工具函数”你需要拿着这些工具去内存里“找”目标然后“修改”它。比如document.getElementById(box).style.color red;这行代码的逻辑是调用全局函数getElementById找对象 - 获取属性style- 修改属性color。这是一个典型的线性执行过程。命令式编程的本质操作 DOM 本质上是一种“命令式编程”。你必须一步步告诉浏览器第一步找到谁第二步改什么第三步插入哪里。这种“手把手教浏览器做事”的过程天然就带有强烈的面向过程色彩。3. 一个有趣的对比同一个操作两种思维假设我们要让一个按钮点击后变红面向过程的操作 DOM传统写法javascript// 1. 找到按钮找工具 const btn document.getElementById(myBtn); // 2. 绑定事件下指令 btn.addEventListener(click, function() { // 3. 修改样式执行动作 btn.style.backgroundColor red; });这里你是在指挥浏览器一步步干活。面向对象的思维如果 DOM API 设计得更现代如果 DOM 设计得更彻底地面向对象代码可能会长这样伪代码javascript// 假设有一个 Button 类 const btn new Button(myBtn); // 对象自己管理自己的状态变化 btn.onClick(() btn.paint(red));但在现实中我们很少这么写因为浏览器提供的原生 API 就是过程式的。4. 现代框架的“拨乱反正”正是因为“用面向对象的 JS 去操作面向过程的 DOM”非常繁琐且容易出错现代前端框架如 Vue、React才应运而生。它们的核心贡献之一就是把操作 DOM 的“面向过程”代码封装成了“声明式”的面向对象/组件化代码。你不再需要写getElementById这种过程式代码。你只需要定义一个“组件对象”并声明它的状态。当状态改变时框架会自动帮你完成底层的 DOM 操作。 总结JS 语言是面向对象的有类、有原型、有对象。DOM 节点是对象有属性、有方法。操作 DOM 的代码往往是面向过程的一步步查找、修改、执行。