可选的`new`运算符

时间:2011-09-05 03:16:11

标签: jquery

阅读有关事件对象及其构造函数$.Event()的jQuery文档,我看到了:

  

new运算符是[在调用构造函数时]的可选项。

太酷了! jQuery人是如何做出这样的伎俩的呢?

2 个答案:

答案 0 :(得分:7)

John Resig很好地解释了这一点:http://ejohn.org/apps/learn/#36http://ejohn.org/apps/learn/#38

基本上,Event是一个函数和一个对象(函数是对象)。事件的第一行检查它是作为函数调用还是作为Event对象的实例调用(使用new运算符)。

如果您正在寻找jQuery的具体方式,请查看jQuery source的第3134-3138行:

jQuery.Event = function( src, props ) {
    // Allow instantiation without the 'new' keyword
    if ( !this.preventDefault ) {
        return new jQuery.Event( src, props );
    }

对此的解释是the jQuery forms

基本上,在3178-3194行,preventDefault事件被添加到Event原型中。如果使用new实例化事件,则会给出此preventDefault方法。否则,它将不会被定义。

答案 1 :(得分:3)

任何用户定义的JavaScript函数都可以使用new运算符调用。没有new它就像普通函数一样工作(因为它就是这样)。使用new,解释器创建一个适当的原型设置的新对象,并使该对象成为调用的this参数。如果函数体new显式为值,则此新鲜对象是return运算符 - 之外的结果;然后返回值管理。

所以,如果你写

function foo() {
   return { bar: 42 };
}

你可以在没有或new的情况下调用它 - 没有区别,因为正文总是显式返回一个值,并且从不使用它的this