javascript - 对象在编程中的作用能否与 React 中高阶组件的工作方式相比较
问题描述
我是编程新手,在学习了一些 JS 之后,我决定做一些 React。坦率地说,在我学习 OOP 的过程中,我无法正确理解对象的概念,因此决定继续学习,希望以后能弄清楚这个概念。后来在 React 中遇到 HOC 的概念,它基本上可以帮助我们在 React 应用中重用某个逻辑,也就是说,如果我们在几个地方使用了一个悬停逻辑,那就是当我们创建 HOC 并在悬停的任何地方重用它使用逻辑。我唯一和主要的问题是面向对象编程中的对象是否以相同的方式工作,也就是说,每当我们在多个地方使用某种逻辑时,我们都需要创建一个对象,然后再重用它。我可以认为 OOP 中的对象就像 React 中的 HOC 吗?
解决方案
面向对象编程依赖于继承作为一种在父子层次结构中的对象之间共享代码的技术。父子层次结构严格的树状性质意味着遇到“钻石问题”并不少见。
在此示例中,Scanner
并Printer
继承自PoweredDevice
. Copier
需要共享两者的行为,Scanner
但Printer
在大多数面向对象的编程语言中,您不允许从两个父级继承。
其他语言和库支持一种称为组合的技术,作为继承的替代方法。React 属于这一类。您可以使用高阶组件定义任意数量的可重用行为,然后将它们全部应用于组件。
function Copier() {
return (
// ...
)
}
export default withScanner(withPrinter(App)))
您仍在创建层次结构,但您是在运行时动态创建它们。没有静态规则说withPrinter
必须是子类——withPoweredDevice
不像传统继承,在创建类时(编译之前)必须定义层次结构。
React 文档甚至提供了一个解决“组合与继承”的文档,这是继续阅读以了解两种范式之间差异的好地方。
总结:
- OOP 和 HOC 都支持代码重用
- OOP 类只能从一个父类扩展
- React 组件可以用任意数量的 HOC 包装
- OOP 只允许沿静态编译时层次结构重用
- HOC 支持跨动态运行时层次结构重用
推荐阅读
- c++ - CMAKE:错误的链接器 (g++) 用于 CUDA 库链接的可执行文件
- javascript - 如何让 JavaScript split() 方法通过新行正确拆分粘贴的文本?
- web-scraping - 从由 jQuery 填充的最初为空的表中导入 Google 表格中的数据
- asp.net-core - 如何仅路由特定路径,否则默认/静态文件
- javascript - 如何获取验证码 ID (opt_widget_id)
- javascript - 如何使用 JavaScript 或 JQuery 删除 url 中的位置哈希
- ruby-on-rails - 如何在葡萄招摇导轨上上传文件?(错误:不支持请求的格式“txt”)
- c# - c#中的异步循环
- angular - 在 formGroup 中避免 '' 的角度最佳实践
- angular - 使用 Angular 单击按钮时增加日期