参考这个不起作用

时间:2015-06-28 12:36:22

标签: javascript

我有以下代码定义单例:

var S = (function() {
    this._enabled = false;

    this.initialize = function() {
        this._doit();
    };

    this._doit = function() {
        this._enabled = true;
    };

    // Exporting
    return {
        Initialize: this.initialize
    };
})();

我打电话:

S.Initialize();

得到这个:

  

'this._doit'不是函数

如果我只是在_doit()中拨打initialize,那就没问题......但我认为我确实设置了this以便在我班级的各个元素中使用。

我做错了什么?感谢

3 个答案:

答案 0 :(得分:2)

因为您正在返回一个包含Initialize的对象,该对象指向构造时this 的初始化函数,这可能是window

您想要执行以下操作:

var S = (function() {
  return {
    _enabled  : false,

    Initialize  : function() {
      this._doit();
    },
    _doit  : function() {
      this._enabled = true;
    }
  };
})();

S.Initialize();

这是一个非常非常不同的事情。

修改:如果您想让_doit()真正保密,您可以写一下:

var S = (function() {
  var s = {
    _enabled  : false,

    initialize  : function() {
      _doit();
    },
  };

  var _doit  : function() {
      s._enabled = true;
  };
  return s;
})();

s成为您对象的公开面孔,而函数关闭其私有方。

答案 1 :(得分:2)

里面

this.initialize = function() {
    this._doit();
};

this是指initialize个对象,所以你要做的是: this.initialize._doit(),不存在。

尝试将this上下文保存到本地变量并使用该变量。

var S = (function() {
    var _this = this;
    this._enabled = false;

    this.initialize = function() {
        _this._doit();
    };

    this._doit = function() {
        _this._enabled = true;
    };

    // Exporting
    return {
        Initialize: this.initialize
    };
})();

答案 2 :(得分:1)

对于你在这里所做的事情,我会完全避免this,例如:

var S = (function() {
    var _enabled = false;

    function initialize() {
        _doit();
    };

    function _doit() {
        _enabled = true;
    };

    // Exporting
    return {
        Initialize: initialize
    };
})();

由于您未使用new关键字,this引用window对象(或在严格模式下,它将引用undefined)。另一种选择是使用new function(),例如:

var S = new function() {
    this._enabled = false;

    this.initialize = function() {
        this._doit();
    };

    this._doit = function() {
        this._enabled = true;
    };
};

S.initialize();