我是一名 C# 开发人员,正在尝试在 javascript 中使用面向对象的编程。对于以下代码
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
中获取私有(private)变量的唯一方法是使用 this.var2 = a;
但它不适用于从其他调用的函数功能。如何从函数 init3()
访问私有(private)变量?
已编辑
即使我像这样更改函数 init3()
var init3 = function(b) {
var3 = b;
};
结果是一样的。所以问题仍然有效。如何从函数中操作私有(private)变量?
最佳答案
您的返回声明
return {
init: init,
var1: var1,
var2: var2,
var3: var3
};
正在公开(设置为返回对象的属性)变量的初始值(在init
运行之前),这些未定义
。您稍后通过设置 this.var2 = a
覆盖 var2
的公开值,并尝试对 var3
执行类似的操作,但是(如前所述在以前的答案中)它不起作用,因为 init3
中的 this
指的是 window
。因此对象属性 var1
和 var3
保持未定义状态,只有 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}
关于javascript - 从函数访问变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14792629/