2

我是 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;
};

结果是一样的。所以问题仍然有效。如何从函数中操作私有变量?

4

3 回答 3

0

您的退货声明

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

正在公开(设置为返回对象的属性)变量的初始值(之前init已运行),即undefined. var2您稍后会通过设置覆盖暴露的值this.var2 = a,并尝试对 执行类似的操作var3,但是(如先前的答案中所述)它不起作用,因为thiswithininit3引用window. 所以对象属性var1var3保持未定义,只会var2发生变化。

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

为了说明,试试这个

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}
于 2013-02-10T00:01:52.347 回答
0

var3在返回的对象中公开了本地,但您从未将其设置为任何东西;你只设置过this.var3。您必须对其进行设置var3 = b才能返回一个值。

此外,如果您的意图是让他们保密,为什么要直接公开他们?难道您不想公开操纵对象私有状态的函数(因为您正在尝试面向对象)?

于 2013-02-09T23:08:17.050 回答
0

而不是使用:

init3(a);

尝试:

init3.call(this, a);

为什么?使用时init3(a)this设置为全局对象(window在浏览器环境中)。函数的call方法可以让你设置this别的东西。在这种情况下,我们只想传播我们的this价值。

于 2013-02-09T23:25:55.240 回答