2013-05-07 77 views
5

我有以下代碼添加功能,對象

var PROMO = PROMO || {}; 

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

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

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

}()); 

在同一個文件我的代碼來調用上面的函數

我試圖去終點,我可以使用下面的代碼

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

這給錯誤

Cannot call method 'Init' of undefined 

現在我知道有很多方法可以編寫javascript,但在這種情況下,我希望能夠以上面顯示的方式調用我的函數,或者至少使用Init方法。

+0

你從來沒有真正分配存儲在'Init'的功能'PROMO.Base.Init' – 2013-05-07 19:35:46

回答

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; 

}()); 

您需要返回面向公衆的功能。查看更新的代碼。

+0

+1這是簡單封閉的一個很好的例子;做得好。 – iGanja 2013-05-07 19:42:22

+0

@ alex23這個;與手頭的問題沒有任何關係,所以我忽略了或者沒有太多注意。 ;) – iGanja 2013-05-07 19:53:43

5

Working fiddle兩種模式,使用IIFE和直接歸因。

使用var將定義設置爲private,並且您的函數不返回任何內容。使用此:

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

您正在與IIFE(立即執行的函數表達式)包裝的定義。所以你的PROMO.Base對象將被賦值爲(function(){//blabla})();返回的值。但是您的功能沒有return聲明。默認情況下,它將返回undefined

哪個方式您PROMO.Baseundefined,你會得到這樣的:

Cannot call method 'Init' of undefined 

如果你真的想要的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(); 

更新

的更好,更容易模式是簡單地將功能分配給PROMO.Base。 Dully注意到你不應該使用靜態函數,而只能使用構造函數。所以如果某些東西不是要實例化的,不要稱之爲Init,它應該是init。這是公約。

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不是我;這是我首選的方法,儘管德魯的方法也是有效的。 – iGanja 2013-05-07 19:43:17

+0

...現在你去了,並添加了回報。再次,我覺得這兩種方法都是有效的。 – iGanja 2013-05-07 19:46:23

+0

很好的答案 – iGanja 2013-05-07 19:49:40

0

你可以將它連接到window對象像...

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

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

})(jQuery, _); 

你做然後加載它。

或者,如果你從jQuery的

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

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

依賴於DOM準備

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