我是C#开发人员,他试图在javascripts中使用面向对象的编程。对于以下代码
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 :(得分:0)
您在返回的对象中暴露了本地var3
,但您从未将其设置为任何内容;你只设置了this.var3
。您必须设置var3 = b
才能返回值。
此外,如果您的意图是私人,为什么要直接公开它们?你宁愿暴露那些操纵对象私有状态的函数(since you're trying to be object-oriented)吗?
答案 1 :(得分:0)
而不是使用:
init3(a);
尝试:
init3.call(this, a);
为什么呢?使用init3(a)
时,this
设置为全局对象(浏览器环境中为window
)。 call
函数方法可让您将this
设置为其他内容。在这种情况下,我们只想传播this
值。
答案 2 :(得分:0)
您的退货声明
return {
init: init,
var1: var1,
var2: var2,
var3: var3
};
正在公开(设置为返回对象的属性)变量的初始值(在init
运行之前),undefined
。您稍后通过设置var2
来覆盖this.var2 = a
的公开值,并尝试为var3
执行类似操作,但是(如前面的答案中所述)它不起作用,因为{{1 } this
中的{}指的是init3
。因此,对象属性window
和var1
仍然未定义,只有var3
更改。
如果这些变量是对象(包括数组和函数,如var2
那样),它们将通过引用而不是值传递,因此init
等的输出将代表当前值,而不是初始值。
例如,try this:
console.log("var1 " + t.var1);