2013-02-09 158 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值。