初始化函数和Javascript中的对象

时间:2012-01-25 20:35:45

标签: javascript oop

我有以下(简化)代码:

var Foo = (function () {
    var data = {},
        settings = {
            // default settings here
        };

    function bar(callback) { // bar is an asynchronous function
        var result = null;
        // fiddle around until you get a result
        if (callback) {
            callback(result);
        }
    }

    return {
        init: function (options, callback) {
            var kallback = callback;
            $.extend(settings, options);
            bar(function () {
                if (kallback) {
                    kallback(WHAT_GOES_HERE);
                }
            });
        },
        debug: function () {
            return {
                settings: settings,
                data: data
            };
        },
        set: function (k, v) {
            settings[k] = v;
        },
        get: function (k) {
            return settings[k];
        }
    };
}());

上面的代码在js文件中,然后在相关页面的页脚中:

<script type="text/javascript">
    Foo.init({ option1: "value", option2: "value" }, function (obj) {
        console.log("The object was ", obj);
    });
</script>

基本上,我希望能够做到这一点:

  1. 创建一个对象(带有一组可选参数,但对此问题不重要)
  2. 在对象的创建阶段,让它调用异步函数
  3. 异步函数完成后,我应该能够触发回调,并且回调的参数应该是初始化对象
  4. 我认为this适用于WHAT_GOES_HERE以上,但事实证明,至少在我测试它时,this是DOM Window对象。

    首先,我正确构建此对象吗?或者有更好的方法来创建它吗?

    其次,假设我这样做是正确的,WHAT_GOES_HERE应该怎么做才能在console.log("The object was ", foo);运行时obj的值是创建的Foo对象?

1 个答案:

答案 0 :(得分:2)

是的,在这种方式调用的匿名函数中, this 将引用窗口对象。要从init方法引用此引用,您必须将引用存储在另一个变量中:

var kallback = callback, self = this;
$.extend(settings, options);
bar(function () {
    if (kallback) {
        kallback(self);
    }
});

构建对象的方式有效,只要你只想拥有一个foo对象。