2012-01-03 24 views
3

我不知道我是否正確。訪問器描述符:如何在實踐中使用'get'和'set'?

這個例子是直接從MDN(Mozilla開發者網絡):

var bValue; 
Object.defineProperty(o, "b", {get : function(){ return bValue; }, 
           set : function(newValue){ bValue = newValue; }, 
           enumerable : true, 
           configurable : true}); 

會發生什麼事 - 它創建了一個名爲bValue一個全局變量,它沒有這樣做。我知道這個例子只是演示了這個用法,因此它可以創建一個全局變量。但是,如果我要在應用程序中使用此,我將修改它咯,通過添加this關鍵字:

Object.defineProperty(o, "b", {get : function(){ return this.bValue; }, 
           set : function(newValue){ this.bValue = newValue; }, 
           enumerable : true, 
           configurable : true}); 

現在,對象o會有財產b,並在同一時間,它也將有另一個屬性bValue。雖然用戶(程序員)仍然可以直接訪問bValue,但只會暴露給'b'而不暴露給'bValue' - 我不明白如何防止它。

據我所知,財產b和財產bValue可能並不總是相同的,但b將取決於bValue的價值,因爲getter和setter允許我們的值賦給b前預處理bValue。

主要問題是,我是否正確?或者我在這裏錯過了什麼?

回答

6

您似乎在尋找一個關閉。這是一種編碼模式,使您可以使用私有變量並僅公開您想要公開的內容(公共變量)。

(function() { 
    var bValue; 

    Object.defineProperty(o, "b", {get : function(){ return bValue; }, 
            set : function(newValue){ bValue = newValue; }, 
            enumerable : true, 
            configurable : true}); 
})(); 

它創建一個函數並立即執行它。這似乎沒用,但由於函數引入範圍bValue的水平不能在任何地方訪問,但在此功能內。

o.b屬性充當開發者和值之間的委託。您本身不能訪問bValue。 (儘管在這個例子中的getter/setter明顯作用,使得它們恰好直接使用bValue這樣做。)

http://jsfiddle.net/W4CSE/2/

+0

啊...... gotchha ...非常感謝。它也很快。再次感謝。 – Golmaal 2012-01-03 13:57:35

+0

+1:很好的答案。我只是想知道是否閉包是這樣做的唯一方式 - 似乎是John Resig在[Object.defineProperty()方法的示例中使用的東西](http://ejohn.org/blog/ecmascript- 5-對象和 - 屬性/)。 – 2012-02-22 14:30:13

+0

@克里斯弗朗西斯:你能詳細說一下嗎?私有變量幾乎與JavaScript中的閉包同義。 – pimvdb 2012-02-22 15:20:00

3

的想法是包裹代碼中的封閉,從而從隱藏bValue世界上,像這樣:

var o =(function() { 

    var o={},bValue;  

    Object.defineProperty(o, "b", {get : function(){ return bValue; }, 
           set : function(newValue){ bValue = newValue; }, 
           enumerable : true, 
           configurable : true}); 


    return o; 

})(); 

現在你可以參考o.b但不bValue