1

私はjavascriptである種の怠惰な初期化されたオブジェクトプロパティを持ちたいので、どういうわけかプロパティの読み取りおよび書き込みアクセスをオーバーロードしたいと思います。

var someval = myobj.lazyprop; // invokes myobj.get("lazyprop");
myobj.lazyprop = someval;     // invokes myobj.set("lazyprop",someval);

ここで、myobjは、スクリプトに提供するオブジェクトです。

理論的根拠:アプリケーションのスクリプトエンジンとしてJavascript(Rhino)を使用したいのですが、スクリプトからアクセスする必要のあるデータ構造は非常に大きく複雑になる可能性があります。したがって、事前にすべてをjavascriptオブジェクト、特にjavascriptオブジェクトにラップしたくありません。このアプリケーションの平均的なスクリプトは、それらの非常に小さなサブセットしか必要としないためです。一方、スクリプトをできるだけシンプルで読みやすくしたいので、スクリプトで明示的に文字列引数を使用してgetメソッドまたはsetメソッドを使用する必要はありません。

4

4 に答える 4

2

多くのjsエンジンは、javascriptオブジェクトのゲッターとセッターをサポートしています。

var obj = {
  get field() {alert('getting field');}
  set field(val) {alert('setting field to ' + val);}
}

var x = obj.field     // alert pops up
obj.field = 'hello'   // alert pops up

詳細:

http://robertnyman.com/2009/05/28/getters-and-setters-with-javascript-code-samples-and-demos/

于 2010-01-13T19:20:58.940 に答える
2

これは、 Rhino1.6R6以降とjavascriptのゲッターおよびセッターを使用して行うことができます。

function Field(val){
   var value = val;

   this.__defineGetter__("value", function(){
       return value;
   });

   this.__defineSetter__("value", function(val){
       value = val;
   });

}

代わりに、オブジェクトプロトタイプのコンテキスト内でゲッターとセッターを定義したい場合(そして「プライベート」データを持つことがそれほど問題にならない場合)、そのための代替オブジェクト構文を使用できます。

function Field(val){
   this.value = val;

}

Field.prototype = {
   get value(){
       return this._value;
   },
   set value(val){
       this._value = val;
   }

};

于 2010-01-13T19:21:25.500 に答える
2

Rhinoバージョン> 1.6R6は、ゲッターとセッターをサポートしています。次のように記述できます。

var myobj = {
  // a getter and setter
  get lazyprop(){ return this.get('lazyprop'); },
  set lazyprop(val){ return this.set('lazyprop', val); },

  // the logic of your get and set methods:
  get: function(p) { return this['_'+p]; },
  set: function(p, val) { this['_'+p] = val; }
};
于 2010-01-13T19:21:59.913 に答える
1

これは、Java側からRhino固有のAPIを使用して行う必要があることだと思います。Javascriptからではありません。

于 2010-01-13T19:17:18.787 に答える