我有这个单身人士。公共函数允许设置私有变量,但我无法按照我在私有方法中使用它们的方式设置它们:
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
在单身人士的公共和私人部分都不可用。我做错了什么?
答案 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
并且您不在函数内时,新变量将附加到父对象的原型。在浏览器中,这将是window
。 window
就像是javascript中的全局单例。
本地变量m_action
是持久的,因为setAction
和getAction
将其作为闭包函数引用,并且变量附加到其作用域。所以它们可以用作setter / getter方法。
现在,您可以在回调中使用ServiceInterface.setAction(sAction);
来设置私有成员。