2014-01-20 73 views
4

我有一個簡單的Javascript「class」即時測試現在。我注意到,在我的私有函數中的「this」並不指向對象本身,而是指向全局範圍(窗口)。Javascript:調用私人函數時對象上下文丟失

爲什麼?

信息:我想保持模式私人,所以我用var模式,而不是this.mode。 我也想保持兩個內部函數私有,所以用戶無法訪問它。 我基本上使用.prototype將公共函數添加到訪問私有成員的myStorage中。

我的代碼:

var myStorage = function(mymode) { 
    var mode = mymode; 
    function privateFunctionA() { 
     // access this.mode to read mymode from constructor but 
     // this is pointing to window 
    }; 

    function privateFunctionB() { 
     // access this.mode to read mymode from constructor but 
     // this is pointing to window 
    }; 

    // check for indexeddb, websql and localstorage 
    if(mymode == 'A') { 
     privateFunctionA(); 
    } else { 
     privateFunctionB(); 
    } 
}; 
myStorage.prototype.publicFunc = function() { 
    console.log(this.mode); // does this work? 
} 

var data = new myStorage(); 
+0

['this' context](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this)確實與範圍無關,它會指向可以訪問其*屬性的對象。 'mode'是一個局部變量* - 對構造函數是私有的。所以不 - 你不能從原型函數訪問它。 – Bergi

+0

'this'引用當前正在執行的函數的所有者對象。嚴格來說,在這種情況下,它是原型對象而不是'myStorage'。 – tiguchi

回答

6

this總是函數作用域在JavaScript(除非你在上下文中通過明確使用call()apply()。因此,在你的私人聚會,this不再指同一this在父範圍。處理一個習慣的方法這在JavaScript是分配this到父範圍例如self變種,

var myStorage = function(mymode) { 
    var self = this; 
    var mode = mymode; 
    function privateFunctionA() { 
     console.log(self); 
    }; 
    ... 
}; 

關於這個片段:

myStorage.prototype.publicFunc = function() { 
    console.log(this.mode); // does this work? 
} 

您需要在您的構造函數中指定modethis(而不是var)。所以,現在的構造會成爲:

var myStorage = function(mymode) { 
    var self = this; 
    this.mode = mymode; 
    function privateFunctionA() { 
     // works 
     console.log(self.mode); 
    }; 
    ... 
}; 

而且this.mode會在你.publicFunc()在這種情況下工作。作爲另一種風格的筆記,JavaScript中的構造函數通常使用適當的駱駝事件(即MyStorage)。

+0

+1,你可能還想指出,私有函數*可以*訪問本地*變量*('mymode','var mode') – Bergi

+0

聽起來不錯,但是沒有辦法保持this.mode或var模式私人所以對象用戶不會看到它? – NovumCoder

+0

奇怪,我如何從我的公共原型函數中調用我的私有函數? self.privateFunctionA和this.privateFunctionA不起作用。 – NovumCoder

0

我不認爲你可以使用原型時,訪問這個對象本身,因爲範圍的變更和你失去了參考的主要對象本身,所以這成爲了窗口,而不是。

檢查,以這個別的問題要得到一些更多的信息:

Use of 'prototype' vs. 'this' in JavaScript?

希望這有助於。

+1

範圍永遠不會改變。上下文('this')確實會改變,但在調用data.publicFunc()時是正確的。 – Bergi

相關問題