2013-05-07 14 views
5

Mam następujący kodfunkcji Dodaj do sprzeciwu

var PROMO = PROMO || {}; 

PROMO.Base = (function() { 
    var _self = this; 

    var Init = function() { 
    WireEvents(); 
    }; 

    var WireEvents = function() { 
    //wire up events 
    }; 

}()); 

w tym samym pliku Mam kod, aby zadzwonić do powyższej funkcji

próbuję dostać się do punktu końcowego, gdzie mogę używać następujący kod

$(document).ready(function() { 
    PROMO.Base.Init(); 
}); 

to daje błąd

Cannot call method 'Init' of undefined 

Teraz wiem, że istnieje wiele sposobów pisania javascript, ale w tym przypadku chcę móc wywoływać moje funkcje, a przynajmniej metodę Init w sposób pokazany powyżej.

+0

Nigdy faktycznie przypisano funkcję składowaną w 'Init' do' PROMO.Base.Init' –

Odpowiedz

6
var PROMO = PROMO || {}; 

PROMO.Base = (function() { 
    var _self = this; 

    var Init = function() { 
    WireEvents(); 
    }; 

    var WireEvents = function() { 
    //wire up events 
    }; 

    var reveal = { 
     Init: Init   
    }; 

    return reveal; 

}()); 

Trzeba zwrócić zwróconej funkcje publiczne. Zobacz zaktualizowany kod.

+0

+1 Jest to doskonały przykład prostego zamknięcia; dobra robota. – iGanja

+0

@ alex23 this; nie miał nic wspólnego z problemem, więc zignorowałem i nie zwracałem na to uwagi. ;) – iGanja

5

Working fiddle z obu wzorów, za pomocą IIFE i bezpośredniego przypisania.

Użycie var powoduje, że definicja jest prywatna, a funkcja nie zwraca nic. Użyj tego:

PROMO.Base = { 
    Init: function() { 
    }, 
    WireEvents: function() { 
    }; 
}; 

Pakujesz definicję za pomocą IIFE (Wyrażenie funkcji Natychmiastowo Wykonane). Tak więc twój obiekt PROMO.Base zostanie przypisany do wartości tego zwrotu w postaci (function(){//blabla})();. Ale twoja funkcja nie ma instrukcji return. Domyślnie zwróci undefined.

Jaki jest sposób, w jaki PROMO.Base będzie undefined i masz to:

Cannot call method 'Init' of undefined 

Jeśli naprawdę chcesz tego Iife:

var PROMO = PROMO || {}; 
// NEVER use _self = this inside static functions, it's very dangerous. 
// Can also be very misleading, since the this object doesn't point to the same reference. 
// It can be easily changed with Function.prototype.call and Function.prototype.apply 
PROMO.Base = (function() { 

    _PROMO = { 
     Init : function() { 
      document.body.innerHTML += "itworks"; 
     }, 
     WireEvents : function() { 
    //wire up events 
     } 
    } 
    return _PROMO; 
}()); 
PROMO.Base.Init(); 

Aktualizacja

lepsze i łatwiejsze wzór jest po prostu przypisać funkcje do PROMO.Base. Zauważ, że nie powinieneś kapitalizować funkcji statycznych, ale tylko konstruktorów. Więc jeśli coś nie ma być tworzone, nie nazywaj tego Init, powinno być init. Taka jest konwencja.

var PROMO = {}; 
PROMO.Base = {}; 
PROMO.Base.init = function() { 
    console.log("this works"); 
}; 
PROMO.Base.wireEvents = function() { 
    console.log("this is a static function too"); 
}; 
+0

+1 nie mnie ; to jest moja preferowana metoda, nawet jeśli metoda Drew jest również poprawna. – iGanja

+0

...a teraz poszedłeś i dodałeś zwrot. ponownie, czuję, że obie metody są prawidłowe. – iGanja

+0

bardzo dobra odpowiedź – iGanja

0

można dołączyć go do obiektu window jak ...

window.PROMO = (function($, _){ 

// this will access PROMO.Base 
PROMO.Base = { 
    // inner functions here 
    Init:{} 
}; 

})(jQuery, _); 

Następnie załadować go, jak to zrobić.

Lub jeśli zależą od jQuery

(function($){ 
    var PROMO = { 
     // inner functions 
     Init: function(){}, 
     WireEvents: function(){} 
    }; 

    $.PROMO = PROMO; 
})(jQuery); 

Na DOM gotowy

jQuery(function ($) { 
    var promo = $.PROMO || undefined; 
    promo.Base.Init(); 
});