javascript - 从函数访问变量

标签 javascript

我是一名 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。因此对象属性 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}

关于javascript - 从函数访问变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14792629/

相关文章:

javascript - 如何一次(同时)更新父状态和子组件 Prop

javascript - 谷歌地图 JavaScript API 不使用最新图像

javascript - jquery - trim 图像以删除 div

javascript - 主干模型保存不起作用

具有覆盖值的 Javascript 订单函数

javascript - Handlebars : Partial not found on first run

javascript - 拉斐尔-JS : Rect with one round corner

javascript - AngularJS,如何更改查询字符串

javascript - 意外值对齐解析 preserveAspectRatio 属性 Firefox 错误

javascript - javascript中的照片马赛克