Javascript单例:如何访问私有变量

Javascript singleton: How to access private variables?

本文关键字:访问 变量 单例 何访问 Javascript      更新时间:2023-09-26

我有这个单例。公共函数允许设置私有变量,但我不能像在私有方法中使用它们那样设置它们:

var ServiceInterface = (function () {
  // Instance stores a reference to the Singleton
  var instance;
  function init() {
    // Singleton
    // Private methods and variables
    var m_action;
    function performAction() {
      alert(m_action);
    }
    return {
      // Public methods and variables
      callBackend: function (sAction) {
        m_action = sAction;
      }
    };
  };
})

m_action在单例的公共和私有部分都不可用。我做错了什么?

我想你指的是这个

var ServiceInterface = (function () {
    var m_action;
    function performAction() {
      alert(m_action);
    }
    return {
      // Public methods and variables
      callBackend: function (sAction) {
        m_action = sAction;
        performAction();
      }
    };
})()
ServiceInterface.callBackend("Hello world");

需要执行匿名函数。运行它可以创建用匿名函数定义的变量和函数,这些变量和函数在外部是看不到的。大多数js库使用这个约定来创建模块,以避免感染全局作用域

var ServiceInterface = (function () {
   // code inside 
})()

这些是被限制在匿名函数执行范围内的变量和函数

// var ServiceInterface = (function () {
    var m_action;
    function performAction() {
      alert(m_action);
    }
// })()

最后,返回一个javascript对象,该对象将公开可以在匿名函数作用域之外访问的函数

//var ServiceInterface = (function () {
//  var m_action;
//    
//  function performAction() {
//       alert(m_action);
//  }
    return {
      // Public methods and variables
      callBackend: function (sAction) {
        m_action = sAction;
        performAction();
      }
    };
//})()

但是,为什么要为单例创建私有变量和方法呢?

这就是如何创建带有私有成员变量的单例。

ServiceInterface = new (function() {
    var m_action = false;
    this.setAction = function(s) {
        m_action = s;
    };
    this.getAction = function() {
        return m_action;
    };
    this.performAction = function() {
        alert(ServiceInterface.getAction());
    };
    this.createCallback = function() {
        return function(sAction) {
            ServiceInterface.setAction(sAction);
        };
    }
})();
ServiceInterface.setAction("secret");
ServiceInterface.performAction();

ServiceInterface成为单例,因为构造函数在创建后被丢弃。ServiceInterface = new (.....)();是如何在声明后立即执行的。它是一个单例,因为没有办法让别人创建另一个实例。

我不使用var来创建实例。当您排除var并且不在函数内部时,新变量将附加到父对象的原型。在浏览器中,这将是windowwindow就像javascript中的全局单例。

局部变量m_action被持久化,因为setActiongetAction将其作为闭包函数引用,并且该变量附加在它们的作用域中。所以它们可以用作setter/getter方法。

你现在可以在回调中使用ServiceInterface.setAction(sAction);来设置私有成员。

http://jsfiddle.net/thinkingmedia/w7DdE/6/