[英]Access variables from functions
我是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
獲取私有變量的唯一方法是使用this.var2 = a;
但不適用於從其他函數調用的函數。 如何從函數init3()
訪問私有變量?
已編輯
即使我像這樣更改函數init3()
var init3 = function(b) {
var3 = b;
};
結果是一樣的。 因此問題仍然有效。 如何從函數操作私有變量?
您正在將本地var3
暴露在返回的對象中,但從未將其設置為任何值。 您只能設置this.var3
。 您必須將var3 = b
設置為返回值。
另外,如果您打算將它們設為私有,那么為什么要直接將它們公開? 您是否不想公開操縱對象私有狀態的函數( 因為您正嘗試面向對象 )?
而不是使用:
init3(a);
嘗試:
init3.call(this, a);
為什么? 當您使用init3(a)
, this
被設置為全局對象( window
在瀏覽器環境)。 該call
的功能的方法可以讓你設置this
別的東西。 在這種情況下,我們只想傳播this
值。
您的退貨單
return {
init: init,
var1: var1,
var2: var2,
var3: var3
};
正在暴露(設置為返回對象的屬性)變量的初始值(在init
運行之前),這些變量的初始值undefined
。 稍后,您可以通過設置this.var2 = a
來覆蓋var2
的公開值,並嘗試對var3
做類似的事情,但是(如先前的回答所述)它不起作用,因為init3
this
引用window
。 因此,對象屬性var1
和var3
保持未定義狀態,只有var2
更改。
如果這些變量是對象(包括init
在內的數組和函數),則它們將通過引用而不是通過值進行傳遞,因此console.log("var1 " + t.var1);
等代表當前值,而不是初始值。
為了說明,請嘗試以下方法 :
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}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.