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

use*_*380 9 javascript constructor coding-style

我通常在代码中使用与设计模式自定义对象非常相似的东西.

但是JSLint对这样的结构不满意:

function MyClass() { this.init(); }
new MyClass(data);
Run Code Online (Sandbox Code Playgroud)

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

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

对于它的价值,我认为这是一个很好的做法,因为:

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

Aar*_*als 8

罗伯特·马丁说,在他的书" 清洁法典 "中

副作用是谎言.你的函数承诺做一件事,但它也做其他隐藏的事情......它们是狡猾的和破坏性的错误,经常导致奇怪的时间耦合和顺序依赖.

您在关于数组的评论中描述的内容听起来像是"奇怪的时间耦合".