在jQuery中扩展原型时,如何保持对this关键字的控制?

时间:2009-08-11 18:05:27

标签: jquery prototype oop this javascript

我在jQuery中实现了类似于类的结构,但是当我尝试调用我的一些函数时遇到了一些麻烦。

这是结构的设置方式:

MyClass = function(name) {
    this.init(name);
}
$.extend(MyClass.prototype, {
    init: function(theName) {
        this.myFunction(); // works
        $('.myclass').each(function(){
            this.myFunction(); // doesn't work
        });
    },
    myFunction = function(){}
});

我遇到的问题是,当我尝试从jQuery块(如上面的myFunction()构造)中调用我的一个函数(例如each())时,我得到了错误“myFunction() is not a function。”

我认为这与this关键字在jQuery块中更改其含义有关,但我不确定。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:4)

您需要将this分配给另一个变量,因为范围的工作原理。

MyClass = function(name) {
    this.init(name);
}
$.extend(MyClass.prototype, {
    init: function(theName) {
        this.myFunction(); // works
        var that = this;
        $('.myclass').each(function(){
                this.myFunction(); // doesn't work
                that.myFunction(); // should work
        });
    },
    myFunction = function(){}
});

答案 1 :(得分:0)

MyClass = function(name) {
    this.init(name);
}
$.extend(MyClass.prototype, {
    init: function(theName) {
        this.myFunction(); // works
        temp = this;
        $('.myclass').each(function(){
                temp.myFunction(); // works
        });
    },
    myFunction = function(){}
});

试试吧。 :)

答案 2 :(得分:0)

.each()函数会更改this的上下文(与JavaScript中的任何函数一样)。

你需要做这样的事情:

MyClass = function(name) {
    this.init(name);
}
$.extend(MyClass.prototype, {
    init: function(theName) {
        this.myFunction(); // works
        var myClass = this;
        $('.myclass').each(function(){
                myClass.myFunction(); // doesn't work
        });
    },
    myFunction = function(){}
});