从javascript模块属性获取未定义

时间:2013-05-31 02:01:52

标签: javascript

我有一种感觉,我错过了一些明显的东西。我正在从我的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!';}”

4 个答案:

答案 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的引用。