Javascript 向对象添加函数
我有以下代码Javascript 向对象添加函数,javascript,jquery,Javascript,Jquery,我有以下代码 var PROMO = PROMO || {}; PROMO.Base = (function () { var _self = this; var Init = function () { WireEvents(); }; var WireEvents = function () { //wire up events }; } ()); $(document).ready(function () { PROMO.Base.In
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();
});
在同一个文件中,我有调用上述函数的代码
我正试图到达一个终点,在那里我可以使用以下代码
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方法 使用IIFE和直接归因两种模式
使用var
将定义设为私有,并且函数不返回任何内容。使用以下命令:
PROMO.Base = {
Init: function() {
},
WireEvents: function() {
};
};
您正在使用IIFE(立即执行的函数表达式)包装定义。因此,您的PROMO.Base
对象将被分配该(function(){//blabla})()的值代码>返回。但是您的函数没有return
语句。默认情况下,它将返回未定义的
这就是你的PROMO.Base
将未定义的方式,你会得到:
Cannot call method 'Init' of undefined
如果你真的想要那种生活:
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
。请注意,不应将静态函数大写,而应仅将构造函数大写。因此,如果某个东西不是要实例化的,不要称它为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.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 ready
jQuery(function ($) {
var promo = $.PROMO || undefined;
promo.Base.Init();
});
您从未将Init
中存储的函数实际分配给PROMO.Base.Init
+1而不是我;这是我的首选方法,即使Drew的方法也是有效的……现在你去添加了回报。同样,我觉得这两种方法都是有效的;与手头的问题没有任何关系,所以我忽略了,或者没有太多注意