2013-05-01 43 views
4

我们有一个JS框架,让我们建立了“模块”。通过调用addModule方法并传递包含有关模块的必需属性的文字对象以及可选方法来添加每个模块。例如:访问parent属性里面对象字面

framework.addModule({ 

    id: "test-module", 
    init: function() { 
     //stuff to do when initializing like set up jQuery bindings 

     $("div").click(function() { 
      // need access to literal object so I can call: 
      something.utility1(); 
     }); 

    }, 

    utility1: function() { 
     something.utility2(); 
    }, 

    utility2: function() { 
     // need access to literal object so I can call: 
    } 

}); 

我试图找出最简单的方法,使物体本身可用于任何代码,在任何级别,对象内部(代替“东西”)。

我已经能够做的最好的事情是添加一个this: this属性的对象,然后在方法我可以把var module = this,它的工作原理,但要求变量添加到每个模块。我想看看是否有另一种方法不需要为每种方法添加一个变量。谢谢。

感谢您的意见和,zzzzBov,感谢您的建议。

但是,它看起来像下面的代码将工作最适合我的需要。我的团队的开发人员正在撰写很多这些模块,我需要解决方案对他们很清楚。不得不打电话$.proxy可能会使其不太清楚。我希望避免把var module = this每种方法,所以这将是清洁的,但它似乎是不可能的,没有它。

framework.addModule({ 
    id: "test-module", 
    init: function() { 
     var module = this;  
     $("div").click(function() {    
      module.utility1(); 
     }); 
    }, 

    utility1: function() { 
     var module = this; 
     module.utility2(); 
    }, 

    utility2: function() {   
    } 
}); 

如果有人有更清洁的解决方案,请告诉我。

+0

你只能得到一个“本”,和你的jQuery事件处理程序有关于它。你只需要将var module = this添加到引发这种冲突的方法的顶部。通常,在.init()中,this.utility1()可以按照您的预期工作。 – dandavis 2013-05-01 17:09:33

+0

可以修改'addModule'也传递一个模块的名称?在模块内部,它可以通过名称引用自己。 – 2013-05-01 17:17:04

回答

0

jQuery有将功能绑定到特定的上下文中的proxy方法。这将打开你的事件绑定到:

$('div').click($.proxy(this, 'utility1')); 

或者,而不是使用对象文本来实例化模块对象,那么你可以匿名函数:

framework.addModule(new function() { 
    this.id = 'test-module'; 
    this.init = function() { 
     $('div').click($.proxy(this, 'utility1')); 
    }; 
    this.utility1 = function() { 
     ...more code... 
    }; 
    this.utility2 = this.utility1; 
});