我有一种感觉,我错过了一些明显的东西。我正在从我的javascript模块返回一个变量,但它一直没有定义。
这是模块:
var MyNs = MyNs || {};
MyNs.Global = function () {
var privateTestVar;
var init = function () {
if (privateTestVar == null ) {
privateTestVar = "this is a test" ;
console.log( 'Init: ' + privateTestVar);
}
};
var Public = {
init: init,
TestVar: privateTestVar
}
return Public;
} ();
这是电话:
MyNs.Global.init();console.log( 'Called: ' +MyNs.Global.TestVar);
init函数中的console.log工作正常并返回值,但另一个控制台日志返回undefined。我完全错过了它。任何帮助将不胜感激。
更新:我已将代码更改为:
var privateTestVar = function () { return 'Test!'; }
var Public = {
TestVar: privateTestVar
}
并且它的变化,但它将这个确切的文本返回到控制台:“function(){return'Test!';}”
答案 0 :(得分:3)
在此处分配Public
时:
var Public = {
init: init,
TestVar: privateTestVar
}
privateTestVar
仍未定义(因为init()
尚未运行),因此TestVar
属性初始化为privateTestVar
的值undefined
}。
TestVar
属性的值为privateTestVar
。如果它最初是未定义的(在这种情况下是这样),它将保持这种状态,直到您为TestVar
属性分配不同的内容。我不会自动继承privateTestVar
的未来值,这可能是您所期待的。 Javascript没有办法指定一个变量将始终包含分配给另一个变量的任何内容。 privateTestVar
和TestVar`属性都有自己的值。将内容分配给一个变量不会影响另一个变量。
答案 1 :(得分:1)
我建议使用getter代替私有变量。这将正常工作:
var Public = {
init: init,
getVar: function() { return privateTestVar; }
}
MyNs.Global.init();console.log( 'Called: ' +MyNs.Global.getVar());
答案 2 :(得分:0)
问题如@jfriend00所述。将代码更改为
var init = function () {
if (privateTestVar == null ) {
privateTestVar = "this is a test" ;
Public.TestVar = privateTestVar;
console.log( 'Init: ' + privateTestVar);
}
};
我没有对此进行测试,但理论上它应该可行。
答案 3 :(得分:0)
我认为这是您正在寻找的结构:
function PrivateFunc(private, public){
this.privateVar = private;
this.publicVar = public;
}
function PublicFun(public){
this.publicVar = public;
if(this.publicVar == null)this.publicVar = 'This is a public variable.';
this.PrivateFun = function(private){
return new PrivateFunc(private, this.publicVar);
}
}
var pf = new PublicFun('public variable');
var pv = pf.PrivateFun('private variable');
console.log('pf.publicVar = '+pf.publicVar);
console.log('pf.privateVar = '+pf.privateVar);
console.log('pv.publicVar = '+pv.publicVar);
console.log('pv.privateVar = '+pv.privateVar);
请注意,PrivateFunc
不是PrivateFun
。真正的因素归结为关键词this
。当您键入this
时,this
引用当前对象。 var
只能在您的方法中访问。您应该将 JavaScript 对象视为关联数组。如果这不符合您的需求,请尝试:
var jsObject = {
publicVar: null,
PrivateFun: function(private){
var privateVar = private; //cannot access with dot
return this;
},
PublicFun: function(public){
this.publicVar = public;
if(this.publicVar == null)this.publicVar = 'This is a public variable';
return this;
}
}
var pf = jsObject.PublicFun();
var pv = jsObject.PrivateFun('private variable');
console.log('pf.publicVar = '+pf.publicVar);
console.log('pf.privateVar = '+pf.privateVar);
console.log('pv.publicVar = '+pv.publicVar);
console.log('pv.privateVar = '+pv.privateVar+' //cannot access with dot');
请注意,Object Literals不是构造函数,因此您无法生成new
个实例。此外,在Object Literal案例中,var privateVar
几乎无用,除非您不希望返回privateVar
。必须返回this
才能访问jsObject,其中包含对publicVar
的引用。