3

私はそれを正しく理解しているかどうかわかりません。

この例は、MDN (Mozilla Developer Network) から直接引用したものです。

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。ユーザー (プログラマー) は 'b' のみに公開され、'bValue' には公開されませんが、bValue に直接アクセスすることはできます。これを防ぐ方法がわかりません。

bプロパティとプロパティbValueが常に同じであるとは限らずb、値に依存することを理解しています。bValueこれは、ゲッターとセッターにより、値を に割り当てる前に bValue を前処理できるためbです。

主な質問は、正しく理解できているかどうかです。それとも、ここで何か不足していますか?

4

2 に答える 2

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/

于 2012-01-03T13:51:51.050 に答える
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

于 2012-01-03T13:52:53.977 に答える