javascript - 为什么在 JavaScript 构造函数中使用副作用是不好的做法?

标签 javascript coding-style constructor

我使用了与设计模式非常相似的东西 custom objects通常在我的代码中。

但是 JSLint 不赞成这样的结构:

function MyClass() { this.init(); }
new MyClass(data);

因为对象在创建后立即被丢弃 - 它没有被用于任何事情。 我们可以通过将它分配给一个变量来欺骗 JSLint 忽略它,但这并没有改变 JSLint(我猜很多 JavaScript 爱好者)不鼓励这种模式。

那么为什么在 JavaScript 构造函数中使用副作用被视为一种不好的做法?

就其值(value)而言,我认为这是一个好的做法,因为:

  1. 你有一个设置函数,因此它应该更容易维护,例如您正在管理一个 MyClass 实例列表以供以后访问。 (将对象插入数组是一种副作用,您必须在构造函数返回后才这样做,因为“良好实践”= 更难维护。)
  2. 它有自己的原型(prototype),因此是“类所有权”:Firebug 将其报告为 MyClass 的实例,而不仅仅是 Object。 (在我看来,这使其优于其他设计模式。)

最佳答案

Robert Martin 在他的Clean Code一书中说

Side effects are lies. Your function promises to do one thing, but it also does other hidden things...they are devious and damaging mistruths that often result in strange temporal couplings and order dependencies.

您在评论中描述的有关数组的内容听起来像是“奇怪的时间耦合”。

关于javascript - 为什么在 JavaScript 构造函数中使用副作用是不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14694982/

相关文章:

java - 我有 2 个结构相同的 bean 和 2 个结构相同的 getter 语句,但只有一个有效

javascript - React useCallback 钩子(Hook),未接收更新的依赖状态值

javascript - 如何获取父 div 内每个 HTML 组件的 class 属性?

javascript - 如何在一个作为模块的 Javascript 文件与另一个不是模块的 Javascript 文件之间共享函数和变量

javascript - 检查 jQuery 中选定的类

javascript - HTML 或 JavaScript 是否有推荐的最大行长度?

c# - 您应该在 Java/C# 中使用国际标识符吗?

php - Laravel:在哪里抛出 HTTP 异常

java - 重写子类中的构造函数

java - 为什么子类的默认构造函数不能通过反射获得?