2013-05-01 45 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; 
});