2013-02-09 136 views
2

我是试图在JavaScript中使用面向对象编程的C#开发人员。对于下面的代码函数访问变量

var np = np || {}; 

np.Class1 = function() { 

    var var1, 
     var2, 
     var3; 

    var init = function(a) { 
     var1 = a; 
     this.var2 = a; 
     init3(a); 
    }; 

    var init3 = function(b) { 
     this.var3 = b; 
    }; 

    return { 
     init: init, 
     var1: var1, 
     var2: var2, 
     var3: var3 
    }; 
}; 

var t = new np.Class1(); 
t.init("t"); 
console.log("var1 " + t.var1); 
console.log("var2 " + t.var2); 
console.log("var3 " + t.var3); 

我越来越:

var1 undefined 
var2 t 
var3 undefined 

,我可以得到私有变量在Class1的唯一方法就是使用this.var2 = a;但它不工作的功能,这是从调用其他功能。我如何从函数init3()访问私有变量?

编辑

即使我改变功能init3()这样

var init3 = function(b) { 
    var3 = b; 
}; 

的结果是一样的。所以问题仍然有效。我怎样才能从函数操作私有变量?

+0

使用'VAR3 = B;'。你想做什么? – Blender 2013-02-09 23:07:48

+0

'a'? 'B'?你没有定义它们。 – 2013-02-09 23:11:49

+0

'var3 = b;'不工作太... – 2013-02-09 23:26:10

回答

0

你return语句

return { 
     init: init, 
     var1: var1, 
     var2: var2, 
     var3: var3 
    }; 

被曝光(设置为返回的对象的属性)变量的初始init已运行之前),这是undefined。您可以稍后通过设置this.var2 = a覆盖的var2暴露值,并尝试做var3类似的东西,但(如在以前的答案说明)这是行不通的,因为内init3thiswindow。因此对象属性var1var3保持未定义状态,只有var2发生更改。

如果这些变量是对象(包括数组和函数,因为init是),它们将通过引用而不是按值传递,因此console.log("var1 " + t.var1);等的输出将表示当前值,而不是初始值。

为了说明,try this

np.Class1 = function() { 
    var someVariables = {}, 
     self; 

    var init = function(a) { 
     self = this; // self now refers to the object from which init was called 
     someVariables.var1 = a; 
     this.var2 = a; 
     init3(a); 
    }; 

    var init3 = function(b) { 
     self.var3 = b; 
    }; 

    return { 
     init: init, 
     vars: someVariables 
    }; 
}; 

var t = new np.Class1(); 
t.init("t"); 
console.log("var1 " + t.vars.var1); // 't' 
console.log("var2 " + t.var2); // 't' 
console.log("var3 " + t.var3); // 't' 
var newObj = {init: t.init} 
newObj.init(true); 
console.log(newObj); // Object {init: function, var2: true, var3: true} 
0

您将在返回的对象中显示本地var3,但您从未将其设置为任何内容;你只有设置this.var3。您必须设置var3 = b才能返回值。

此外,如果你的意图是让他们成为私人,你为什么直接暴露他们?难道你不愿意暴露操纵对象私有状态的函数吗?(since you're trying to be object-oriented)?

+0

我只是为了验证目的而暴露它们以验证它。我知道这整个类是很奇怪的,但我的问题是关于访问函数的私有变量。 – 2013-02-09 23:22:54

0

而不是使用:

init3(a); 

尝试:

init3.call(this, a); 

为什么?当您使用init3(a)时,this被设置为全局对象(浏览器环境中的window)。功能的call方法可让您将this设置为其他内容。在这种情况下,我们只是想传播我们的this值。