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");
};
Nigdy faktycznie przypisano funkcję składowaną w 'Init' do' PROMO.Base.Init' –