Javascript singleton:如何访问私有变量?

时间:2014-03-14 12:22:15

标签: javascript variables singleton

我有这个单身人士。公共函数允许设置私有变量,但我无法按照我在私有方法中使用它们的方式设置它们:

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在单身人士的公共和私人部分都不可用。我做错了什么?

2 个答案:

答案 0 :(得分:2)

我认为你指的是这个

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();
      }
    };
//})()

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

答案 1 :(得分:1)

这是您使用私有成员变量创建单例的方法。

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/