代码之家  ›  专栏  ›  技术社区  ›  Josh Leitzel

在jquery中扩展原型时,如何维护对该关键字的控制?[复制品]

  •  1
  • Josh Leitzel  · 技术社区  · 16 年前

    这个问题已经有了答案:

    我在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(){}
    });
    

    我遇到的问题是,当我试图调用我的函数(例如, myFunction() )从jquery块内部(如 each() 上面的结构),我得到错误“ myFunction() is not a function ."

    我想这和 this 关键字在jquery块中更改其含义,但我不确定。任何帮助都将不胜感激!

    3 回复  |  直到 16 年前
        1
  •  4
  •   Tyler Carter    16 年前

    你需要分配 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(){}
    });
    
        2
  •  0
  •   VoteyDisciple    16 年前

    这个 .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(){}
    });
    
        3
  •  0
  •   Salty    16 年前
    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(){}
    });
    

    试试看。:)