2

次のような JavaScript オブジェクトを使用しています。

var obj = new Foob;

プライベートな方法があるようなふりをして、次のことを行う必要があります。

obj.get('foo');

または、次のように直接アクセスしようとする必要があります:

obj.foo
4

3 に答える 3

7

Javascript の最も知られていない機能の 1 つは、ゲッターとセッターをネイティブにサポートすることです。
プロパティを定義するときは、次のように単純に定義できます。

someObj.prop = 12;

Object.definePropertyまたは、予約語getandを使用して getter と setter を定義できますset

Object.defineProperty ( someObj,    "prop" ,  
                                              { get : function () { return ??; } ,
                                                set : function (val) { /* store val */ }            } ;

「クラス」内でそのようなゲッター/セッターを使用してプライベート変数を取得する方法は次のとおりです。

var MyClass = function() {
  var _private = 5;
  
  Object.defineProperty(this, "public", {
    get : function() { return _private; },
    set : function(val)  { _private=val; }
  });
  
  return this;
};

var anInstance = new MyClass();

anInstance.public = 12 ; 
console.log(anInstance.public)   ;  // writes 12
console.log(anInstance._private) ;  // writes undefined. 

したがって、ゲッターとセッターで武装した真にプライベートな変数があります。

明らかに、バウンドチェック/タイプチェックを行うか、別の特定の理由がない限り、ゲッター/セッターコードを使用することにあまり関心がありません。

于 2013-04-21T21:10:09.467 に答える
4

オブジェクト指向の JavaScript を多用し始めた頃は、getter と setter のアイデアが好きでしたが、それは私が Java のバックグラウンドを持っていたからです。

ES5 は特別な構文を介してゲッターとセッターをサポートします

John Resig の説明を参照してください。

http://ejohn.org/blog/javascript-getters-and-setter/

私の考えは、ゲッター/セッターがなぜ便利なのかを考えることです。変数のアクセスをカプセル化して、傍受/制御できるようにする方法があります。コードの呼び出しが別のオブジェクトのインスタンス変数を直接変更する場合、それを透過的に変更することはできません。これらのミューテーションをすべてキャッチするには、変数のスコープを変更し、getter と setter を追加し、すべての呼び出しコードを変更する必要があります。

ただし、この構文は呼び出し元のコードに対して透過的です。したがって、プロパティを直接制御できるようにするだけで、それをインターセプトする必要がある場合、たとえばデバッグ用に console.log を追加する場合は、getter と setter を追加するだけで機能します。

function Foob() {
}
Foob.prototype = {
  get foo() {
    return this._foo;
  },
  set foo(foo) {
    this._foo = foo;
  }
};

var o = new Foob();
console.log(o.foo);

ゲッター/セッター構文​​の欠点は、実際には変数を非公開にしないことです。ヴィンセントが示したようにコンストラクター内で定義しない限り、秘密の内部名を使用できるように変数を「隠す」だけです。

完全に非公開にするには:

function Foob() {
  var foo;
  this.__defineGetter__('foo', function () { 
    return foo;
  });
  this.__defineSetter__('foo', function (_foo) {
    foo = _foo;
  });
}

var o = new Foob();
console.log(o.foo);
于 2013-04-21T21:26:14.847 に答える