Javascript объект передачи себя - PullRequest
1 голос
/ 15 декабря 2011

Нужна действительно быстрая помощь,

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.

Ответы [ 2 ]

1 голос
/ 15 декабря 2011

Две вещи.

  1. Ваш that указывает на this, который создал contactForm, не фактическую contactForm, как вы ожидаете.
  2. Ваш that является свойством контактной формы, поэтому вам необходимо получить к нему доступ через this.that или contactForm.that, что нарушает первоначальную цель.

Либо:

  1. Ссылка сама по себе contactForm
  2. , либо определение that s внутри нужных функций

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

Если все, что вам нужно, это избегать this shenanigans, альтернативой является использование замыканий (и, следовательно, лексической, статической области видимости вместо динамического связывания через 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 голосов
/ 15 декабря 2011

Вы слишком усложняете это; просто позвоните 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...