Javascript单例:如何访问私有变量
Javascript singleton: How to access private variables?
我有这个单例。公共函数允许设置私有变量,但我不能像在私有方法中使用它们那样设置它们:
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
并且不在函数内部时,新变量将附加到父对象的原型。在浏览器中,这将是window
。window
就像javascript中的全局单例。
局部变量m_action
被持久化,因为setAction
和getAction
将其作为闭包函数引用,并且该变量附加在它们的作用域中。所以它们可以用作setter/getter方法。
你现在可以在回调中使用ServiceInterface.setAction(sAction);
来设置私有成员。
相关文章:
- 存储$http如何从$http函数(Angularjs)外部获取可访问变量中的响应
- 查询后websql成功回调无法访问变量
- 无法访问变量
- 从ajax调用成功内部访问变量
- 从子弹出子窗口访问变量
- 下划线模板无法访问变量
- Meteor Iron路由器通过[data]vs[params]访问变量
- CanvasJS-访问变量-访问属性toString的权限被拒绝
- 如何从嵌套函数中访问变量
- 在<%%中定义的访问变量>从<脚本></脚本>
- 自提交表单访问变量javascript
- 如何访问变量
- 稍后在链中访问变量
- 在 Javascript 中访问变量
- 在方法调用对象之外访问变量而不使它们全局化(可能吗?
- 如何从函数/实例外部访问变量
- 从另一个脚本源访问变量
- Meteor:跨所有 Meteor.method的访问变量
- 每次加载页面时,火狐附加组件访问变量
- 在另一个函数中访问变量,返回未定义的 - JavaScript