为什么我的代码替换了jQuery.error函数?

时间:2011-07-08 04:57:02

标签: jquery

我有以下代码,它似乎覆盖了jQuery.error函数:

    $.test = function(){
        var test = this;

        test.error = function(){
            console.log('Why is this function getting called');
        };    
    };

    $(document).ready(function(){
        var someObj = $.test();
        $.error();
    });

此代码将在控制台中输出“为什么要调用此函数”。

但是,如果我稍微更改了我的代码,则会调用本机jQuery错误函数:

$(document).ready(function(){
    var someObj =  new $.test();
    $.error();
});

似乎在第一个例子中,'this'指的是jQuery,但在第二个例子中它指的是someObj。这是为什么?

1 个答案:

答案 0 :(得分:2)

您的方法$.test$对象上的新属性。所以有意义的是,该方法中的this对象 - 方法的范围 - 是属性所属的对象。

没有jQuery的例子(在这里小提琴:http://jsfiddle.net/kxncT/):

var a = {};

a.method = function() {
    alert(this === a);  // true
};

a.method();

但是,当您调用new运算符时,您正在调用构造函数。在这种情况下,将为新对象创建一个新范围。因此,如果在上面的示例中调用new a.method(),则警报将显示为false,因为创建的新范围是新的,与父对象无关。

在写这个答案时,我试图解释我在这篇博文中读到的内容:http://javascriptweblog.wordpress.com/2010/08/30/understanding-javascripts-this/ 该帖子比我的回答要好得多,如果有任何不符之处,请相信帖子:)