Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/89.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 向对象添加函数_Javascript_Jquery - Fatal编程技术网

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的方法也是有效的……现在你去添加了回报。同样,我觉得这两种方法都是有效的;与手头的问题没有任何关系,所以我忽略了,或者没有太多注意