gpt4 book ai didi

javascript - 初学者 JavaScript OOP 与函数式

转载 作者:可可西里 更新时间:2023-11-01 01:55:15 26 4
gpt4 key购买 nike

我刚刚开始研究不同的编程风格(OOP、函数式、过程式)。

我正在学习 JavaScript 并开始学习 underscore.js 并开始学习 this文档中的一小部分。文档说 underscore.js 可以用于面向对象或函数式风格,并且这两种方式会产生相同的结果。

_.map([1, 2, 3], function(n){ return n * 2; });
_([1, 2, 3]).map(function(n){ return n * 2; });

我不明白哪个是函数式的,哪个是 OOP,我也不明白为什么,即使在对这些编程范式进行了一些研究之后也是如此。

最佳答案

编程范式

面向对象编程 (OOP) 和函数式编程 (FP) 是编程范例。粗略地说,遵循编程范式就是编写符合一组特定规则的代码。例如,将代码组织成单元称为 OOP,避免副作用称为 FP。

每种编程范式都由特定的功能组成,但是您最喜欢的语言不必提供属于一种范式的所有功能。事实上,OOP 可以没有inheritance。或 encapsulation ,因此我们可以说,JavaScript(JS)是一门具有继承性、没有封装性的 OOP 语言。

既然您对什么是编程范式有了一点了解(希望如此),让我们快速了解一下 OOP 和 FP 的基础知识。

面向对象编程

在 OOP 中,对象是一个框,其中包含应该引用相同概念的信息和操作。信息通常被称为“属性”,操作通常被称为“方法”。属性允许跟踪对象的状态,方法允许操纵对象的状态。

在 JS 中,您可以向对象发送消息以执行特定方法。下面的代码展示了如何在 JS 中调用一个方法。 “point”对象有两个属性“x”和“y”,以及一个名为“translate”的方法。 “translate”方法根据给定的向量更新“点”的坐标。

point = {
x: 10, y: 10,
translate: function (vector) {
this.x += vector.x;
this.y += vector.y;
}
};

point.x; // 10
point.translate({ x: 10, y: 0 });
point.x; // 20

这么简单的案例涉及的功能并不多。在 OOP 中,代码通常被划分为类,并且通常支持继承和多态性。但我不会进一步详细说明,因为恐怕我已经超出了您的问题范围。

函数式编程

在 FP 中,代码本质上是函数的组合。此外,数据是不可变的,这导致编写没有副作用的程序。在函数式代码中,函数无法改变外部世界,输出值仅取决于给定的参数。

实际上,只要您处理好副作用,JS 就可以用作 FP 语言,对此没有内置机制。以下代码是此类编程风格的示例。 “zipWith”函数来自 Haskell世界。它使用给定函数合并两个列表,碰巧是 add(point[i], vector[i])

zipWith = function (f, as, bs) {
if (as.length == 0) return [];
if (bs.length == 0) return [];
return [f(as[0], bs[0])].concat(
zipWith(f, as.slice(1), bs.slice(1))
);
};

add = function (a, b) {
return a + b;
};

translate = function (point, vector) {
return zipWith(add, point, vector);
};

point = [10, 10];
point[0]; // 10
point = translate(point, [10, 0]);
point[0]; // 20

虽然这个定义非常肤浅。例如,Haskell 是一种纯函数式语言,它实现了更多的概念,例如函数组合、仿函数、柯里化(Currying)、monad 等。

结论

其实OOP和FP是两个没有共同点的不同概念,甚至可以说没有可比性。因此,我认为您从 Underscore.js 文档中阅读的内容是对语言的误用。

你不应该在这个库的范围内学习编程范式。事实上,您使用 Underscore.js 编写代码的方式使其类似于 OOP 和 FP,但这只是外观问题。因此,引擎盖下没有什么真正令人兴奋的:-)


请参阅维基百科进行深入阅读。

关于javascript - 初学者 JavaScript OOP 与函数式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37231841/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com