我通常在代码中使用与设计模式custom objects非常相似的内容。为什么在JavaScript构造函数中使用副作用不好的做法?
但是JSLint的皱眉在结构是这样的:
function MyClass() { this.init(); }
new MyClass(data);
因为对象被创建后立即丢弃 - 它没有被用于任何东西。 我们可以欺骗JSLint通过将它分配给一个变量来忽略这一点,但它并没有改变JSLint(我猜很多JavaScript爱好者)不鼓励这种模式。
那么,为什么在JavaScript构造函数中使用副作用被认为是不好的做法?
对于它的价值,我认为这是一个很好的实践因为:
- 你有一个设置功能,因此它应该是更容易维护,如果如您正在管理MyClass实例的列表以供稍后访问。 (把一个对象放到一个数组上是一个副作用,在构造函数返回时是“很好的做法”=难以维护)。
- 它有自己的原型,因此是“类所有权”: Firebug将此报告为MyClass的一个实例,而不仅仅是Object。 (这一点,在我看来,使其优于其他的设计模式。)
JSLint不鼓励'新的MyClass',因为在实例化它之后你并没有使用它。因此,它只被用于其副作用。相反,这个例子可以被重写为使用依赖注入作为'initialize(new MyClass());'(尽管这个例子非常简单以至于很愚蠢)。 – zzzzBov
你真的从来没有将任何新创建的MyClass实例赋值给任何东西(换句话说,这是一种使init()成为一种静态方法的复杂方法)吗?这种模式的“正常”使用不会触发JSLint警告。 –
@FrédéricHamidi从来都不是,但有时会产生副作用,即完成这项工作本身,即没有什么需要去做。人员构造函数可能会实例化一个人员对象,但是您现在可能不一定需要对该人员进行操作。在你需要的情况下,副作用将自己注册到一个数组中以供以后访问。 – user1994380