为什么没有覆盖选项?

时间:2010-12-20 22:46:00

标签: javascript

在我的模块模式中,由于某种原因,选项是“未定义的”..有没有人知道为什么它们没有被正确传递?

Framework.MyModule = (function(options) {
    var defaults = {
        someOption : 1,
        stuff      : 2
    };
    if (!options) {
        var options = defaults;
    } else {
        for (var index in defaults) {
            if (typeof options[index] == 'undefined')
                options[index] = defaults[index];
        }
    }
    var module = {};

    // Initialize
    _something();

    // Private Methods
    function _something() {}

    // Public Methods
    module.click = function() {};

    return module;
})();


... docready function ...

var options = {
  someOption : 9,
  stuff      : 10
};

Framework.MyModule(options);

... end doc ready ...

请看小提琴:http://jsfiddle.net/kWHEZ/1/

3 个答案:

答案 0 :(得分:3)

var options = { /* ... */};
Framework.MyModule = (function(options) {
  /* .. options are undefined ... */
})();

Framework.MyModule = (function(options) {
  /* .. options are defined... */
})(options);

现在,如果您希望能够添加私有/公共变量并仍然传递选项,则需要使用它来使用公共对象返回构造函数方法 - 因此不会在立即运行的函数中传递选项。因为老实说..这不是真的有意义。


你可以这样做:

var Module = {};
Module.Foo = (function($){ // jQuery is accessible as $
    var _private = {
        defaults: {
            url: '/default-url', container: '#dummy'
        },
        foos: []
    };

    return function(o){ // returns constructor
        // other _private variables are accessible here
        var opts = $.extend({}, _private.defaults, o);
        var self = { // public return object
            load: function(){
                $(opts.container).load(opts.url);
            }
        };
        _private.foos.push(self);
        return self;
    };
})(jQuery); // scope global variables


var foo1 = Module.Foo({
    url: '/test.php', 
    container: '#success'
});

var foo2 = Module.Foo({
    url: '/test2.php', 
    container: '#success2'
});

foo1.load();
foo2.load();

答案 1 :(得分:2)

您没有将任何选项传递给匿名函数调用。

如果您希望使用自定义选项,则必须以})(options);结束通话。

答案 2 :(得分:1)

您正在立即执行该功能。该函数返回模块,它是一个对象,而不是一个函数。你的意思是返回一个函数吗?

然后使用:

调用它
Framework.MyModule(options);