2011-12-15 55 views
0

尋找一些真正快速幫助,Javascript對象通過自身

contactForm={ 
    that: this, 
    lilfield: 'I just equal this', 
    fields: new Array("hc_name","hc_email","hc_telephone"), 
    submit_button: jQuery("#hc_submit"), 
    init: function(){ 
     that.lilAlert(); 
    }, 
    lilAlert: function(){ 
     alert("lets pump this out"); 
    } 
} 

上述只是一個例子,但是有效地我想要實現的是可以使用的變量進行呼叫,而比引用對象'contactForm'本身。此外,這比使用這個更安全一些,因爲這會自動傳遞給jQuery等點擊等事件。

+0

您是否在尋找http://api.jquery.com/jQuery.extend/關閉(因此詞法,靜態的範圍,而不是通過動態綁定this)? – 2011-12-15 11:14:24

回答

1

兩件事。

  1. 因爲你希望你的that是指向this創建的聯繫形式,實際的聯繫形式。
  2. 您的that是聯繫表格的一個屬性,因此您需要通過this.thatcontactForm.that來訪問它,這種類型打破了原來的目的。

或者:

  1. 參考聯繫形式本身
  2. 或者如果你想定義需要它

    init: function(){ 
        var that = this; 
        that.lilalert(); 
    } 
    

功能內that小號做的是AV OID this有心計,另一種方法是使用

function make_contact_form(){ 
    var lilfield: 'I just equal this'; 
    var fields = ["hc_name","hc_email","hc_telephone"]; //dont use new Array. its evil 
    var submit_button = jQuery("#hc_submit"); 
    var init = function(){ 
     lilAlert(); //lilAlert is a name is scope. call it directly 
    }; 
    var lilAlert = function(){ 
     alert("lets pump this out"); 
    }; 

    return { 
     lilfield: lilfield, 
     fields: fields, 
     submit_button: submit_button, 
     init: init, 
     lilAlert: lilAlert 
    }; 
} 
0

你太過於複雜;只要撥打this.lilAlert(),它就可以正常工作,只要您撥打init()就可以了contactForm

contactForm.init(); // this will work; 

setTimeout(contactForm.init, 1000); // this won't work, as `init()` will have `this` set to `window` 
setTimeout(function() { // This approach will work though. 
    contactForm.init(); 
}, 1000); 
+0

它在這個意義上工作正常。但是,舉例來說,我做這個, clickAction:function(){ this.lilAlert(); } 並從jQuery綁定中調用該綁定,例如: jQuery(「#element」)。bind('click',contactForm.clickAction); 我們現在將遇到問題,因爲當從對象範圍引用時,這將成爲單擊而非對象的元素。 – David 2011-12-15 11:10:31

+0

@David;所有你需要做的就是把它包裝在一個匿名函數中,就像我做`setTimeout`的例子一樣; (jQuery(「#element」)。bind('click',function(){contactForm.clickAction});` – Matt 2011-12-15 11:34:03