我看了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
隐藏在程序员之外是不好的做法那,但没有详细说明。
我的问题是,上述一般认为好,坏,或无所谓,为什么?
答案 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的人可能会因为增加的可用性而赞美你。