在构造函数中包装新的好坏?

时间:2010-05-17 02:38:38

标签: javascript

我看了John Resig的Best Practices in JavaScript Library Design演讲;一张幻灯片建议“调整”对象构造函数,以便实例化它自己。

function jQuery(str, con) {
    if (window === this) {
        return new jQuery(str, con);
    }
    // ...
}

这样,new jQuery("#foo")变为jQuery("#foo")

我认为它很有趣,但我没有在我自己的代码中编写类似的构造函数。

过了一会儿,我在这里看了一篇文章。 (对不起,我不记得哪个或者我提供了一个链接。如果我能再次找到它,我会更新问题。)其中一条评论说将new隐藏在程序员之外是不好的做法那,但没有详细说明。

我的问题是,上述一般认为好,坏,或无所谓,为什么?

3 个答案:

答案 0 :(得分:5)

当人们忘记在“课堂”功能面前使用new操作员时,这是一种防御性技术。
逻辑是如果在没有new的情况下调用函数,那么全局范围仍然是当前范围(而不是新实例),因此我们只使用new运算符调用相同的函数。

但是如果你问我,正确的做法就是抛出一个错误,让开发人员知道它犯了错误,而不仅仅是“接受”它。

但是,嘿,我猜它根据jQuery口头禅:
'而不是让用户编写高质量的代码,启用/强制他们编写不合逻辑和无效的代码'。

答案 1 :(得分:4)

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

如果您要构建constructor function,确定要使用新创建的对象实例(this),并且将会发生 ,如果{{1}指向全局对象。

幸运的是,在严格模式上的ECMAScript 5 Edition中,this在调用函数时只包含this,而没有基础对象,undefined 1}} operator ...

另见:

答案 2 :(得分:1)

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

与做:

相同
function getObject(){ return new SomeObject; }

唯一的区别是你实际上是在回归自己。但是,如果你清楚地记录它,它似乎并没有误导。习惯于jQuery的人可能会因为增加的可用性而赞美你。