2012-01-03 10 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を事前処理することができますので、bbValueの値に依存することを理解しています。

主な質問は、正しくなっていますか?または私はここに何かを逃していますか?

答えて

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にアクセスすることはできません。 (この例では明らかにゲッター/セッターは、彼ら正確が直接bValueを使用するのと同じことを行うよう行動するけど。)

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

+0

ああを参照することができます...おかげでたくさん。それも速かったです。再度、感謝します。 – Golmaal

+0

+1:すばらしい答え。私は閉鎖がこれを行う唯一の方法であるかどうか疑問に思っていました - John Resigが[Object.defineProperty()メソッドの例]で使っているようです(http://ejohn.org/blog/ecmascript- 5つのオブジェクトとプロパティ/)。 –

+0

@Chris Francis:少しお寄せください。プライベート変数は、JavaScriptのクロージャとほぼ同じです。 – pimvdb

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; 

})(); 

今あなたがgotchha ... o.bなくbValue

関連する問題