我有以下代码,它似乎覆盖了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。这是为什么?
答案 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/ 该帖子比我的回答要好得多,如果有任何不符之处,请相信帖子:)