在构造函数中使用new关键字是否好还是不好?

6
我观看了约翰·雷西格的JavaScript库设计最佳实践演示文稿;其中一张幻灯片建议“调整”对象构造器,以便它能够自行实例化。
function jQuery(str, con) {
    if (window === this) {
        return new jQuery(str, con);
    }
    // ...
}

因此,new jQuery("#foo") 变为 jQuery("#foo")

我认为这很有趣,但我自己的代码中没有编写过这样的构造函数。

后来我在这里读到了一篇文章。(抱歉,我不记得是哪篇了,否则我会提供链接。如果我能再次找到它,我将更新问题。)其中一条评论说将 new 隐藏在程序员身后是不好的做法,但没有详细说明原因。

我的问题是,上述内容通常被认为是好的、坏的还是无关紧要的,为什么?

3个回答

5
这是一种防御性技术,用于当人们忘记在“class”函数前面使用new运算符时。逻辑是,如果在没有new的情况下调用函数,则全局范围仍将是当前范围(而不是新实例),因此我们只需使用new运算符调用同一函数。
但如果你问我,正确的做法应该是抛出一个错误,并让开发者知道它犯了一个错误,而不仅仅是“接受”它。
不过,嘿,我想这符合jQuery的口号:
“不是让用户编写高质量的代码,而是让/强制他们编写不合逻辑和无效的代码”。

4

我认为这是一种实用且完全有效的防御技术。

如果您正在构建一个构造函数,那么您肯定想使用新创建的对象实例(this),如果this指向全局对象,将会发生意想不到的事情。

幸运的是,在未来的ECMAScript 5版本中,在严格模式下,当没有基本对象或new运算符调用函数时,this将仅包含undefined...

另请参见:


1

你正在从一个函数中返回一个对象。我认为这没有问题。

这与以下操作相同:

function getObject(){ return new SomeObject; }

唯一的差别在于你实际上是返回了自己。但是,如果你清晰地记录下来,这并不会让人感到误导。那些习惯使用jQuery的人可能会为增加的可用性而赞扬你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接