1

我想在javascript中有某种惰性初始化对象属性,因此希望以某种方式重载属性读写访问,即:

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

其中 myobj 是我提供给脚本的一些对象。

理由:我想在应用程序中使用 Javascript (Rhino) 作为脚本引擎,并且脚本需要访问的数据结构可能非常庞大和复杂。所以我不想提前将它们全部包装到 javascript 对象中,尤其是。因为此应用程序中的普通脚本只需要其中的一小部分。另一方面,我希望脚本尽可能简单易读,因此我不想在脚本中明确要求使用带有字符串参数的 get 或 set 方法。

4

4 回答 4

2

许多 js 引擎在 javascript 对象上支持 getter 和 setter:

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

您可以使用带有javascript getter 和 setter的Rhino 1.6R6或更高版本来完成。

function Field(val){
   var value = val;

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

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

}

现在,如果我们想在我们的对象原型的上下文中定义 getter 和 setter(并且在“私有”数据不那么重要的情况下),我们可以为此使用另一种对象语法。

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支持 getter 和 setter,你可以这样写:

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 回答