向对象添加function
我有以下代码
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方法。
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; } ());
您需要返回面向公众的function。 查看更新的代码。
使用IIFE和直接归因,兼顾两种模式。
使用var
会使定义变为私有,并且您的函数不返回任何内容。 用这个:
PROMO.Base = { Init: function() { }, WireEvents: function() { }; };
您正在使用IIFE(立即执行的函数表达式)包装定义。 因此,您的PROMO.Base
对象将被赋值为that (function(){//blabla})();
回报。 但是你的函数没有return
语句。 默认情况下,它将返回undefined
。
这是你的PROMO.Base
undefined
,你得到这个:
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"); };
您可以将它附加到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(); });